好的,我有类似的情况,它是我业务逻辑中的一种访问控制方法。
有一个保存功能可以应用于我的任何持久层对象。
所以看起来像这样
public static Save<T>(AccessControl.User user,T entity) where T:PersistanceLayerBaseClass
{
if(CanWrite(user, entity))
{
entity.save();
}
else
{
throw new Exception("Cannot Save");
}
}
我如何在访问控制方面为某些实体提供一些自定义代码,所以我编写了以下内容,它使用 System.Reflection 寻找更适合问题的方法,“这个实体可以由这个用户编写吗?”
public static Boolean CanWrite<T>(AccessControl.User user, T entity) where T : PersistanceLayerBaseClass
{
int? clubId = null;
MethodInfo methodInfo = entity.GetType().GetMethod("CanWrite", new Type[] { typeof(AccessControl.User), entity.GetType() });
if(methodInfo != null)
{
return (Boolean)methodInfo.Invoke(null, new object[] { user, entity }) ;
}
else
{
//generic answer
}
return HasRole(user.UserID, "Administrator") || (clubId.HasValue && user.MemberObject.ClubId == clubId.Value && HasRole(user.UserID, "AdministerClub"));
}
现在每次我添加或删除一个方法时,我只需要在一个地方添加或删除它