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对实体的意义,如需转载请自行联系原博主。

目录
相关文章
|
7月前
|
Java
领域驱动设计(DDD)中的实体,值对象,和聚合
领域驱动设计(DDD)中的实体,值对象,和聚合
|
canal 消息中间件 存储
DDD领域驱动设计实战(六)-理解领域事件(Domain Event)(中)
DDD领域驱动设计实战(六)-理解领域事件(Domain Event)(中)
648 0
|
11月前
DDD - 如何理解Entity与VO
DDD - 如何理解Entity与VO
11181 0
|
数据库
一对多关系domain Model中设置使用AutoMapper时出错
一对多关系domain Model中设置使用AutoMapper时出错
143 0
一对多关系domain Model中设置使用AutoMapper时出错
|
测试技术 数据库
Grails里DOMAIN类的一对一,一对多,多对多关系总结及集成测试
终于干完这一章节,收获很多啊。 和DJANGO有类似,也有不同。 User.groovy: package com.grailsinaction class User { String loginId String password Date dat...
1240 0
|
存储 数据安全/隐私保护 微服务
DDD领域驱动设计实战(六)-理解领域事件(Domain Event)(上)
DDD领域驱动设计实战(六)-理解领域事件(Domain Event)(上)
412 0
DDD领域驱动设计实战(六)-理解领域事件(Domain Event)(上)
|
消息中间件 前端开发 数据管理
DDD领域驱动设计实战(六)-理解领域事件(Domain Event)(下)
DDD领域驱动设计实战(六)-理解领域事件(Domain Event)(下)
556 0
|
前端开发 Java 测试技术
殷浩详解DDD系列 第一讲 - Domain Primitive
# 写在最前面 对于一个架构师来说,在软件开发中如何降低系统复杂度是一个永恒的挑战,无论是94年GoF的Design Patterns,99年的Martin Fowler的Refactoring,02年的P of EAA,还是03年的Enterprise Integration Patterns,都是通过一系列的设计模式或范例来降低一些常见的复杂度。但是问题在于,这些书的理念是通过技术手段解
30522 9
|
NoSQL MongoDB 数据格式