首页 > 代码库 > Lind.DDD.Domain.IOwnerBehavor对实体的意义

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对实体的意义