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,这就是面向接口的魅力,我们将某种特征抽象成接口,方便以后对这种特征进行统一的管理!
感谢各位的阅读!