zoukankan      html  css  js  c++  java
  • 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,这就是面向接口的魅力,我们将某种特征抽象成接口,方便以后对这种特征进行统一的管理!

    感谢各位的阅读!

     回到目录

  • 相关阅读:
    Django 2.0.1 官方文档翻译: 编写你的第一个 Django app,第四部分(Page 9)
    Django 2.0.1 官方文档翻译: 编写你的第一个 Django app,第一部分(Page 6)
    Django 2.0.1 官方文档翻译: 编写你的第一个 Django app,第二部分(Page 7)
    Django 2.0.1 官方文档翻译: 编写你的第一个 Django app,第三部分(Page 8)
    Django 2.0.1 官方文档翻译: 如何安装 django (Page 17)
    Django 2.0.1 官方文档翻译: 文档目录 (Page 1)
    Django 2.0.1 官方文档翻译: 快速安装向导 (Page5)
    如何画流程图
    centos7.x firewall简单使用
    cetos6配置用msmtp和mutt发邮件(阿里云)
  • 原文地址:https://www.cnblogs.com/lori/p/5890745.html
Copyright © 2011-2022 走看看