Lind.DDD.Domain.IOwnerBehavor对实体的意义

简介:

对于Lind.DDD架构,我之前写了不少文章,对于它的Domain模式也介绍了不少,像之前的IEntity,ILogicDeleteBehavor,IModifyBehavor,IStatusBehavor和ISortBehavor都有自己的功能,只要实体实现对外的接口,就具有了某种特性或者某种功能,而今天主要说一下拥有者接口,IOwnerBehavor,它主要用在管理系统的实体中,如一个员工资产表,当这个员工离职后,它对应资产将被进行转移,转移到一个新的用户身上,而这个用户就是这个资产的新拥有者

拥有者接口

    /// <summary>
    /// 拥有者行为
    /// </summary>
    public interface IOwnerBehavor
    {
        /// <summary>
        /// 拥有者Id
        /// </summary>
        int OwnerId { get; set; }
    }

实体继承它

  /// <summary>
    /// 操作日志
    /// </summary>
    [TableAttribute("WebLogger")]
    public partial class WebLogger : Lind.DDD.Domain.Entity, Lind.DDD.Domain.IOwnerBehavor
    {
        /// <summary>
        /// 操作者ID
        /// </summary>
        [DisplayName("操作者ID")]
        public int UserId { get; set; }
        /// <summary>
        /// 操作者
        /// </summary>
        [DisplayName("操作者")]
        public string UserName { get; set; }
        /// <summary>
        /// 控制器名称
        /// </summary>
        [DisplayName("控制器")]
        public string ControllerName { get; set; }
        /// <summary>
        /// Action名称
        /// </summary>
        [DisplayName("Action")]
        public string ActionName { get; set; }
        /// <summary>
        /// 操作权限
        /// </summary>
        [DisplayName("操作权限")]
        public string Authority { get; set; }
        /// <summary>
        /// 当前请求的Get和Post参数JSON串
        /// </summary>
        [DisplayName("请求参数")]
        public string RequestParams { get; set; }
        /// <summary>
        /// 功能说明
        /// </summary>
        [DisplayName("功能说明")]
        public string Description { get; set; }


        #region IOwnerBehavor 成员

        public int OwnerId
        {
            get;
            set;
        }

        #endregion
    }

Lind.DDD.Manager集成它

功能主要有两个:修改单独表的拥有者和修改所有表的拥有者,如张三走了,由李四接管,这时我们通过拥有者接口就可以很方便的实现!

   /// <summary>
    /// 拥有者控制器
    /// </summary>
    public class OwnerController : Controller
    {
        /// <summary>
        /// 具有拥有者字段的数据表
        /// </summary>
        /// <returns></returns>
        public ActionResult Index()
        {
            return View(Lind.DDD.Utils.AssemblyHelper.GetTypeNamesByInterfaces(typeof(IOwnerBehavor)));
        }

        /// <summary>
        /// 更新指定表的拥有者字段
        /// </summary>
        /// <param name="id"></param>
        /// <returns></returns>
        public ActionResult Edit(string name)
        {
            ViewBag.Name = string.IsNullOrWhiteSpace(name) ? "全部表" : name;
            return View();
        }

        /// <summary>
        /// 更新表字段
        /// </summary>
        /// <param name="name"></param>
        /// <param name="val"></param>
        /// <param name="newVal"></param>
        void UpdateTable(string name, int oldVal, int newVal)
        {
            var type = AssemblyHelper.GetEntityTypeByName(name);
            Type reposType = typeof(ManagerEfRepository<>);
            var objType = reposType.MakeGenericType(type);
            object o = Activator.CreateInstance(objType);
            var entity = objType.InvokeMember("GetModel", BindingFlags.Default | BindingFlags.InvokeMethod, null, o, null);
            var atest = (IEnumerable)entity;

            var newList = (IList)Activator.CreateInstance(typeof(List<>).MakeGenericType(type));

            foreach (var item in atest)
            {
                if ((int)type.GetProperty("OwnerId").GetValue(item) == oldVal)
                {
                    var a = Convert.ChangeType(item, type);
                    type.GetProperty("OwnerId").SetValue(item, newVal);
                    newList.Add(item);
                }
            }

            objType.InvokeMember("BulkUpdate", BindingFlags.Default | BindingFlags.InvokeMethod, null, o, new object[] { newList, "OwnerId" });
        }
        [HttpPost]
        public ActionResult Edit(string name, FormCollection collection)
        {
            try
            {
                int oldVal;
                int.TryParse(collection["oldValue"], out oldVal);
                int val;
                int.TryParse(collection["newValue"], out val);

                if (string.IsNullOrWhiteSpace(name))//全部表
                {
                    foreach (var type in AssemblyHelper.GetTypeNamesByInterfaces(typeof(IOwnerBehavor)))
                    {
                        UpdateTable(type, oldVal, val);
                    }
                }
                else
                {
                    UpdateTable(name, oldVal, val);
                }

                return RedirectToAction("Index");
            }
            catch
            {
                throw;
            }
        }


    }

Lind.DDD.Manager运行结果

经过上面操作后,灵气表WebLogger里的OwnerId字段将由1变更为11,这就是面向接口的魅力,我们将某种特征抽象成接口,方便以后对这种特征进行统一的管理!

感谢各位的阅读!

 本文转自博客园张占岭(仓储大叔)的博客,原文链接:Lind.DDD.Domain.IOwnerBehavor对实体的意义,如需转载请自行联系原博主。

目录
相关文章
|
SQL 缓存 Java
殷浩详解DDD系列 第三讲 - Repository模式
# 第三讲 - Repository模式 **写在前面** 这篇文章和上一篇隔了比较久,一方面是工作比较忙,另一方面是在讲Repository之前其实应该先讲Entity(实体)、Aggregate Root(聚合根)、Bounded Context(限界上下文)等概念。但在实际写的过程中,发现单纯讲Entity相关的东西会比较抽象,很难落地。所以本文被推倒重来,从Repository
36159 8
|
canal 消息中间件 存储
DDD领域驱动设计实战(六)-理解领域事件(Domain Event)(中)
DDD领域驱动设计实战(六)-理解领域事件(Domain Event)(中)
804 0
DDD - 如何理解Entity与VO
DDD - 如何理解Entity与VO
11273 0
|
存储 数据安全/隐私保护 微服务
DDD领域驱动设计实战(六)-理解领域事件(Domain Event)(上)
DDD领域驱动设计实战(六)-理解领域事件(Domain Event)(上)
484 0
DDD领域驱动设计实战(六)-理解领域事件(Domain Event)(上)
|
前端开发 Java 测试技术
殷浩详解DDD系列 第一讲 - Domain Primitive
# 写在最前面 对于一个架构师来说,在软件开发中如何降低系统复杂度是一个永恒的挑战,无论是94年GoF的Design Patterns,99年的Martin Fowler的Refactoring,02年的P of EAA,还是03年的Enterprise Integration Patterns,都是通过一系列的设计模式或范例来降低一些常见的复杂度。但是问题在于,这些书的理念是通过技术手段解
31654 10
|
消息中间件 前端开发 数据管理
DDD领域驱动设计实战(六)-理解领域事件(Domain Event)(下)
DDD领域驱动设计实战(六)-理解领域事件(Domain Event)(下)
658 0
|
NoSQL MongoDB 数据格式