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,这就是面向接口的魅力,我们将某种特征抽象成接口,方便以后对这种特征进行统一的管理!
感谢各位的阅读!
分类:
其它 / 系统架构
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 记一次.NET内存居高不下排查解决与启示
2012-09-20 爱上MVC3系列~改变Areas的FindView顺序
2011-09-20 做项目,还是标准点好(对象命名标准),呵呵
2011-09-20 MVC中当Action名称与页面名称不同时