[Architecture Pattern] Context

动机

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

 

本文介绍一个简单的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; }
}
posted @ 2011-10-10 09:55  Clark159  阅读(366)  评论(0编辑  收藏  举报