您的位置:首页 > 大数据 > 人工智能

Lind.DDD.Domain.IOwnerBehavor对实体的意义

2016-09-20 22:31 323 查看
回到目录

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

感谢各位的阅读!

回到目录
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: