1

我有很多服务,每个服务都有很多功能。几乎每个功能都需要当前用户执行它所需的特定“角色”。

有没有比将以下代码放在每个方法的开头更好的方法?如果我可以用 Attributes 装饰这些方法,那就太好了,但我不确定如何在这里应用它们。

public void CreateTruck(TruckDto dto)
{
    var currentUser = GetCurrentUser();
    if (!currentUser.Can("CreateTruck"))
        throw PermissionException("...");

    // otherwise proceed normally
}
4

1 回答 1

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
    }
}

并且您的调用方法检查属性的表达式,因此可以基于属性抛出异常。不过,这似乎有点矫枉过正。

于 2012-05-16T18:12:04.720 回答