zoukankan      html  css  js  c++  java
  • [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; }
    }
    
  • 相关阅读:
    Java学习心得16
    Java学习心得15
    Java学习心得14
    Java学习心得13
    Java学习心得12
    Java学习心得11
    Java学习心得10
    Java学习心得09
    Java学习心得08
    JVM垃圾回收
  • 原文地址:https://www.cnblogs.com/clark159/p/2205123.html
Copyright © 2011-2022 走看看