• [Architecture Pattern] Entity Profile


    动机 :

    前一篇  [Application Architecture] : Entity Expansion模式,介绍了一种扩展对象属性数据的模式。本文延续上一篇的动机,介绍一个Entity Profile模式。

    Entity Profile模式主要是定义一组,数据对象(Entity)以及边界对象(Repository)的生成、结构、行为模式,用来扩展对象的属性数据。实作这个模式,可以为系统加入增加式程序代码累积的能力。

    基础平台 :

    结构

    参与者

    Page Shell
    -页面的壳层,可以透过设定数据,动态挂载系统页面的系统。

    范例程序

    Page Shell依照开发平台的不同,会有不同的选择。 例如以ASP.NET的平台来说,可以直接套用ASP.NET的页面机制,然后再另外建立一个索引页面,用修改索引页面的方式来达成动态挂载系统页面的需求。

    基础项目 :

    结构

    参与者

    UserManagePage
    -User管理页面,提供新增、修改、删除、查询 User的功能。
    -使用例如 Spring.Net、Provider Pattern来反射生成 IUserProfileRepository。
    -使用生成的 IUserProfileRepository生成 UserRepository。
    -使用 UserRepository新增、修改、删除、查询 User。

    UserProfile
    -进出系统边界的数据对象。

    IUserProfileRepository
    -数据对象 UserProfile进出系统边界的接口。
    -提供新增、修改、删除、查询等功能。

    User
    -系统运作使用的数据对象。
    -属性数据存放于 UserProfile。

    UserRepository
    -数据对象 User进出系统边界的接口。
    -使用 IUserProfileRepository,处理自数据对象 User取得的 UserProfile。
    -提供新增、修改、删除、查询等功能。

    范例程序

    namespace CLK.EntityProfile
    {
        public class UserManagePage
        {
            public void ShowUser()
            {
                // GetData
                IUserProfileRepository userProfileRepository = null; // 使用例如Spring.Net、Provider Pattern来反射生成。(Base专案生成、Ex专案生成,均生成同一个 IUserProfileRepository)
    
                UserRepository userRepository = new UserRepository(userProfileRepository);
    
                IEnumerable<User> userCollection = userRepository.GetAll();
    
                // Show
                this.ShowUser(userCollection);
            }
    
            private void ShowUser(IEnumerable<User> userCollection)
            {
                //.....
            }
        }
    
        public class UserProfile : Dictionary<string, string>
        {
            public Guid UserID { get; set; }
        }
    
        public interface IUserProfileRepository
        {
            // Methods
            void Add(UserProfile item);
    
            void Modify(UserProfile item);
    
            void Remove(Guid id);
    
            UserProfile GetByID(Guid id);
    
            IEnumerable<UserProfile> GetAll();
        }
    
        public class User
        {
            // Properties
            protected internal UserProfile Profile { get; private set; }
    
            public Guid UserID
            {
                get
                {
                    return this.Profile.UserID;
                }
                set
                {
                    this.Profile.UserID = value;
                }
            }
    
            public string Name
            {
                get
                {
                    return Convert.ToString(this.Profile["Name"]);
                }
                set
                {
                    this.Profile["Name"] = value;
                }
            }
    
            public string Description
            {
                get
                {
                    return Convert.ToString(this.Profile["Description"]);
                }
                set
                {
                    this.Profile["Description"] = value;
                }
            }
    
    
            // Constructor
            public User()
            {
                this.Profile = new UserProfile();
                this.UserID = Guid.Empty;
                this.Name = string.Empty;
                this.Description = string.Empty;
            }
        }
    
        public class UserRepository
        {
            // Properties
            private readonly IUserProfileRepository _userProfileRepository = null;
    
    
            // Constructor
            public UserRepository(IUserProfileRepository userProfileRepository)
            {
                #region Require
    
                if (userProfileRepository == null) throw new ArgumentNullException();
    
                #endregion
                _userProfileRepository = userProfileRepository;
            }
    
    
            // Methods
            private User CreateUser(UserProfile userProfile)
            {
                #region Require
    
                if (userProfile == null) throw new ArgumentNullException();
    
                #endregion
    
                User user = new User();
                user.UserID = userProfile.UserID;
                foreach (string key in userProfile.Keys)
                {
                    user.Profile.Add(key, userProfile[key]);
                }
                return user;
            }
    
            private UserProfile CreateUserProfile(User user)
            {
                #region Require
    
                if (user == null) throw new ArgumentNullException();
    
                #endregion
    
                return user.Profile;
            }
    
    
            public void Add(User item)
            {
                #region Require
    
                if (item == null) throw new ArgumentNullException();
    
                #endregion
                _userProfileRepository.Add(this.CreateUserProfile(item));
            }
    
            public void Modify(User item)
            {
                #region Require
    
                if (item == null) throw new ArgumentNullException();
    
                #endregion
                _userProfileRepository.Modify(this.CreateUserProfile(item));
            }
    
            public void Remove(Guid id)
            {
                #region Require
    
                if (id == Guid.Empty) throw new ArgumentNullException();
    
                #endregion
                _userProfileRepository.Remove(id);
            }
    
            public User GetByID(Guid id)
            {
                #region Require
    
                if (id == Guid.Empty) throw new ArgumentNullException();
    
                #endregion
                return this.CreateUser(_userProfileRepository.GetByID(id));
            }
    
            public IEnumerable<User> GetAll()
            {
                List<User> itemCollection = new List<User>();
                foreach (UserProfile userProfile in _userProfileRepository.GetAll())
                {
                    itemCollection.Add(this.CreateUser(userProfile));
                }
                return itemCollection;
            }
        }
    }

    扩展专案 :

    结构

    参与者

    ExUserManagePage
    -ExUser管理页面,提供新增、修改、删除、查询 User的功能。
    -使用例如 Spring.Net、Provider Pattern来反射生成 IUserProfileRepository。
    -使用生成的 IUserProfileRepository生成 ExUserRepository。
    -使用 ExUserRepository新增、修改、删除、查询 ExUser。

    ExUser
    -系统运作使用的数据对象。
    -属性数据存放于 UserProfile。

    ExUserRepository
    -数据对象 ExUser进出系统边界的接口。
    -使用 IUserProfileRepository,处理自数据对象 ExUser取得的 UserProfile。
    -提供新增、修改、删除、查询等功能。

    范例程序

    namespace CLK.EntityProfile.Expanded
    {
        public class ExUserManagePage
        {
            public void ShowExUser()
            {
                // GetData
                IUserProfileRepository userProfileRepository = null; // 使用例如Spring.Net、Provider Pattern来反射生成。(Base专案生成、Ex专案生成,均生成同一个 IUserProfileRepository)
    
                ExUserRepository exUserRepository = new ExUserRepository(userProfileRepository);
    
                IEnumerable<ExUser> exUserCollection = exUserRepository.GetAll();
    
                // Show
                this.ShowExUser(exUserCollection);
            }
    
            private void ShowExUser(IEnumerable<ExUser> exUserCollection)
            {
                //.....
            }
        }
    
        public class ExUser : User
        {
            // Properties
            public string Address
            {
                get
                {
                    return Convert.ToString(this.Profile["Address"]);
                }
                set
                {
                    this.Profile["Address"] = value;
                }
            }
    
    
            // Constructor
            public ExUser()
                : base()
            {
                this.Address = string.Empty;
            }
        }
    
        public class ExUserRepository
        {
            // Properties
            private readonly IUserProfileRepository _userProfileRepository = null;
    
    
            // Constructor
            public ExUserRepository(IUserProfileRepository userProfileRepository)
            {
                #region Require
    
                if (userProfileRepository == null) throw new ArgumentNullException();
    
                #endregion
                _userProfileRepository = userProfileRepository;
            }
    
    
            // Methods
            private ExUser CreateExUser(UserProfile userProfile)
            {
                #region Require
    
                if (userProfile == null) throw new ArgumentNullException();
    
                #endregion
    
                ExUser exUser = new ExUser();
                exUser.UserID = userProfile.UserID;
                foreach (string key in userProfile.Keys)
                {
                    exUser.Profile.Add(key, userProfile[key]);
                }
                return exUser;
            }
    
            private UserProfile CreateUserProfile(ExUser exUser)
            {
                #region Require
    
                if (exUser == null) throw new ArgumentNullException();
    
                #endregion
    
                return exUser.Profile;
            }
    
    
            public void Add(ExUser item)
            {
                #region Require
    
                if (item == null) throw new ArgumentNullException();
    
                #endregion
                _userProfileRepository.Add(this.CreateUserProfile(item));
            }
    
            public void Modify(ExUser item)
            {
                #region Require
    
                if (item == null) throw new ArgumentNullException();
    
                #endregion
                _userProfileRepository.Modify(this.CreateUserProfile(item));
            }
    
            public void Remove(Guid id)
            {
                #region Require
    
                if (id == Guid.Empty) throw new ArgumentNullException();
    
                #endregion
                _userProfileRepository.Remove(id);
            }
    
            public ExUser GetByID(Guid id)
            {
                #region Require
    
                if (id == Guid.Empty) throw new ArgumentNullException();
    
                #endregion
                return this.CreateExUser(_userProfileRepository.GetByID(id));
            }
    
            public IEnumerable<ExUser> GetAll()
            {
                List<ExUser> itemCollection = new List<ExUser>();
                foreach (UserProfile userProfile in _userProfileRepository.GetAll())
                {
                    itemCollection.Add(this.CreateExUser(userProfile));
                }
                return itemCollection;
            }
        }
    }

    结语 :

    本文范例简单的说就是,基础项目的 User与扩展项目的 ExUser,转为统一的 UserProfile,使用共同的一个IUserProfileRepository进出系统边界。(*UserProfile有各种的实作方法)

    本文介绍的Entity Profile模式,扩展了对象的属性数据,但其实可以看成,处理了强行别扩展对象进出系统边界的责任。以此模式为基础发展,理论上可以设计出能无限扩充属性数据的应用系统架构。

  • 相关阅读:
    VS2010中使用JSONCPP方法
    VC获取外网IP
    JSON样例
    JSON详解
    vc获取本地IP
    Java中创建对称密钥的代码
    密和解密程序的一些概念
    在ireport报错 报 jdk5找不到的解决办法
    Java中创建对称密钥的步骤
    比较好用的一个jaspereport模板 生成html页面模板
  • 原文地址:https://www.cnblogs.com/clark159/p/2205139.html
Copyright © 2020-2023  润新知