回到目錄 對於Lind.DDD架構,我之前寫了不少文章,對於它的Domain模式也介紹了不少,像之前的IEntity,ILogicDeleteBehavor,IModifyBehavor,IStatusBehavor和ISortBehavor都有自己的功能,只要實體實現對外的介面,就具有了某種特性或 ...
對於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,這就是面向介面的魅力,我們將某種特征抽象成介面,方便以後對這種特征進行統一的管理!
感謝各位的閱讀!