1

いくつかのサービスがあり、各サービスにはいくつかの機能があります。ほとんどの各機能には、現在のユーザーがそれを実行するために必要な特定の「役割」が必要です。

各メソッドの先頭に次のコードを配置するよりも良い方法はありますか? これらのメソッドを Attributes で装飾できればいいのですが、ここでそれらをどのように適用できるかわかりません。

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

    // otherwise proceed normally
}
4

1 に答える 1

0

これが起こっているのを確認する方法は 2 つあります。

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 に答える