文章出處

回到目錄

對于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,這就是面向接口的魅力,我們將某種特征抽象成接口,方便以后對這種特征進行統一的管理!

感謝各位的閱讀!

 回到目錄


文章列表




Avast logo

Avast 防毒軟體已檢查此封電子郵件的病毒。
www.avast.com


arrow
arrow
    全站熱搜
    創作者介紹
    創作者 大師兄 的頭像
    大師兄

    IT工程師數位筆記本

    大師兄 發表在 痞客邦 留言(0) 人氣()