1. 程式人生 > >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,這就是面向介面的魅力,我們將某種特徵抽象成介面,方便以後對這種特徵進行統一的管理!

感謝各位的閱讀!

 回到目錄