2

利用可能なアクティビティを表す特定の列挙型のアクセス許可を確認するモジュールを登録するカスタム承認サービスをコーディングしようとしています。

public interface IAuthorizationService
{
    void Register<T>(IAuthorizationModule module);
    bool Authorize<T>(T activity);
}

public class AuthorizationService : IAuthorizationService
{
    private readonly Dictionary<Type, IAuthorizationModule> activities;

    public AuthorizationService()
    {
        activities = new Dictionary<Type, IAuthorizationModule>();
    }

    public void Register<T>(IAuthorizationModule module)
    {
        activities[typeof(T)] = module;
    }

    public bool Authorize<T>(T activity)
    {
        return activities[typeof(T)].Authorize(activity);
    }
}
public interface IAuthorizationModule
{
    bool Authorize<T>(T activity);
}

public class OrderAuthModule : IAuthorizationModule
{
    public bool Authorize<OrderActivity>(OrderActivity activity)
    {
        return activity == OrderActivity.Cancel;
    }
}

public enum OrderActivity
{
    Place,
    Cancel,
    Refund
}

このコードは、次の例外でコンパイルに失敗しています:

'OrderActivity' is a 'type parameter', which is not valid in the given context

オンライン: return activity == OrderActivity.Cancel;

型(enum)に応答するモジュールを登録するIAuthorizationModule<T>ための辞書が必要なため、インターフェイスを as として宣言することはできません。<Type, IAuthorizationModule>T

ここで何が欠けていますか?

4

3 に答える 3

2

さて、あなたのデザインは私には聞こえません。具体的なクラスと の実装からAuthorizeService、それぞれIAuthorizationModuleが 1 つのタイプのアクティビティのみを担当する必要があると思います。私が正しければ、インターフェイスは次のように宣言する必要があります

public interface IAuthorizationModule<T>
{
    bool Authorize(T activity);
}

public class OrderAuthModule : IAuthorizationModule<OrderActivity>
{
    public bool Authorize<OrderActivity>(OrderActivity activity)
    {
        return activity == OrderActivity.Cancel;
    }
}

AuthorizationServiceそれに応じて変更する必要もあります。

public class AuthorizationService : IAuthorizationService
{
    private readonly Dictionary<Type, object> activities;

    public AuthorizationService()
    {
        activities = new Dictionary<Type, object>();
    }

    public void Register<T>(IAuthorizationModule<T> module)
    {
        activities[typeof(T)] = module;
    }

    public bool Authorize<T>(T activity)
    {
        return ((IAuthorizationModule<T>)activities[typeof(T)]).Authorize(activity);
    }
}

このようにして、それぞれの実装が簡単になりますIAuthorizationModule

于 2013-06-14T02:50:31.953 に答える