我有很多服务,每项服务都有很多功能。几乎每个功能都需要一定的“角色”。当前用户需要执行它。
有没有比在每个方法的开头添加以下代码更好的方法?如果我可以用属性装饰这些方法会很好,但我不确定如何在这里应用它们。
public void CreateTruck(TruckDto dto)
{
var currentUser = GetCurrentUser();
if (!currentUser.Can("CreateTruck"))
throw PermissionException("...");
// otherwise proceed normally
}
答案 0 :(得分:0)
我发现这种情况有两种方式:
1 - 你不会改变任何东西,或者只是简单地改变它:
EnsureUserCan("CreateTruck");
在内部有这个方法调用:
protected void EnsureUserCan(string role)
{
if(!GetCurrentUser().Can(role))
throw PermissionException("...");
}
2 - 你转向一个调用者模式:
var myNewTruck = ServiceInvoker.Invoke<TruckService>(x => x.CreateTruck(dto));
public class ServiceInvoker
{
public ReturnType Invoke<ServiceType, ReturnType>(Expression<Func<ServiceType, ReturnType>> methodExpression)
{
// blah blah
var myService = IoC.Resolve<ServiceType>();
return methodExpression.Compile()(myService); // etc
}
}
并且您的invoke方法检查属性的表达式,因此可以基于属性抛出异常。这看起来有点矫枉过正。