Хорошо, у меня похожая ситуация, это метод контроля доступа в моей бизнес-логике.
Существует функция сохранения, которая может быть применена к любому из моих объектов слоя устойчивости.
так это выглядит так
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"));
}
Теперь каждый раз, когда я добавляю или удаляю метод, мне нужно только добавить или удалить его в одном месте