你的位置:首页 > ASP.net教程

[ASP.net教程]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,这就是面向接口的魅力,我们将某种特征抽象成接口,方便以后对这种特征进行统一的管理!

感谢各位的阅读!

 回到目录