[Architecture Pattern] Context

动机

在设计面向对象应用程序的时候,简单的分层会将系统分为Presentation Layer(PL)、 Business Logic Layer(BLL)、Data Access Layer(DAL)。但是三层之间的对象生成、依赖注入等等的设计会是一件很复杂的事情。例如:PL对象该怎么去生成BLL的对象、DAL的对象该怎么注入BLL。

 

本文介绍一个简单的Context模式,用来框出一个面向对象应用程序的架构,让每一层的对象设计有可循的规范。

 

结构

[Architecture Pattern] Context

 

参与者

UserReportPage
-用户接口,呈现用户数据的报表。
-使用ContextContainer的静态属性取得Context。
-使用Context底下挂载的各种View、Repository,来做BLL边界的数据对象进出。

 

ContextContainer
-提供Context统一存放的对象。
-使用ContextFactory来生成Context以及底下挂载的各种View、Repository。

 

ContextFactory
-生成Context以及底下挂载的各种View、Repository。
-使用例如Spring.Net、Provider Pattern来反射生成DAL的各种View、Repository。

 

Context
-提供挂载的各种Repository,来做BLL边界的数据对象进出。

 

User
-进出BLL边界的数据对象。

 

IUserRepository
-数据对象进出BLL边界的接口。
-单纯的新增、修改、删除、查询。

 

SqlUserRepository
-数据对象进出BLL边界的接口IUserRepository的实作。
-依靠ContextFactory生成。
-将数据对象存入SQL数据库。
*也可实做OracleUserRepository将数据对象存入Oracle数据库。

 

OtherService
-BLL内,有功能却不需要进出边界的服务对象。

 

范例程序

*范例只包含关键片段的程序代码

 

public class UserReportPage

{

    // Methods

    public void ShowAllUser()

    {

        // 透过BLL边界取得数据对象

        IEnumerable<User> userCollection = ContextContainer.CurrentContext.UserRepository.GetAll();



        // Show

        this.ShowUser(userCollection);

    }



    private void ShowUser(IEnumerable<User> userCollection)

    {

        //.....

    }

}



public class ContextContainer

{

    // Properties

    private static Context _currentContext = null;



    public static Context CurrentContext

    {

        get

        {

            if (_currentContext == null)

            {

                ContextFactory contextFactory = new ContextFactory();

                _currentContext = contextFactory.CreateContext();

            }

            return _currentContext;

        }

    }

}



public class ContextFactory

{

    // Methods

    public Context CreateContext()

    {

        IUserRepository userRepository = null; // 使用例如Spring.Net、Provider Pattern来反射生成。

        return new Context(userRepository);

    }

}



public class Context

{        

    // Constructor

    public Context(IUserRepository userRepository)

    {

        this.UserRepository = userRepository;

    }



    // Properties

    public IUserRepository UserRepository { get; set; }

}



public interface IUserRepository

{

    // Methods

    void Add(User item);



    void Modify(User item);



    void Remove(Guid id);



    User GetByID(Guid id);



    IEnumerable<User> GetAll();

}



public class User

{

    // Properties

    public Guid UserID { get; set; }



    public string Name { get; set; }



    public string Description { get; set; }

}

你可能感兴趣的:(Architecture)