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;

我无法声明接口,IAuthorizationModule<T>因为我需要一个字典<Type, IAuthorizationModule>来注册将响应类型T(枚举)的模块。

我在这里缺少什么?

4

3 回答 3

2

更新Authorize<T>可以修复它..

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

用法:

        var authorization = new AuthorizationService();

        var orderMod = new OrderAuthModule();

        authorization.Register<OrderActivity>(orderMod);

        var status = authorization.Authorize(OrderActivity.Place);

希望,我没有弄错上下文...

对于记录:

您可以使用 struct 约束将泛型类型参数约束为值类型(例如 int、bool 和 enum)或任何自定义结构:Ref

public class MyClass<T> where T : struct 

{...}
于 2013-06-14T03:57:59.537 回答
2

好吧,你的设计对我来说并不好听。从您的具体类和实现中AuthorizeService,我假设每个IAuthorizationModule应该只负责一种类型的活动。如果我是对的,那么接口应该声明为

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 回答
1

请试试这个 luiz

编辑:

public bool Authorize<T>(T activity)
        {
            return activity.Equals(OrderActivity.Cancel);
        }

编辑:做 switch 语句试试这个 luiz

OrderActivity act = (OrderActivity)Enum.Parse(typeof(OrderActivity), activity.ToString());
            switch (act)
            {
                case OrderActivity.Place:
                    return true;
                    break;
                case OrderActivity.Cancel:
                    return false;
                    break;
                default:
                    return default(bool);
            }

重要的是 switch() 上面的行,在那里你将活动变量解析为 enum 变量并将其放入 switch,希望它有帮助......1)我们在 T 上检查相等性(占位符未设置为在我的情况下是任何东西)和枚举值,在你的情况下是例外(使用类型(T))2)它不起作用,因为我们处理的 T 没有定义为任何特定的东西,而 swtch 在 bool、string 上运行,char,int,enum 或相应的可空类型和我的编辑中的活动是 T,很高兴我能提供帮助:)

于 2013-06-14T00:35:03.670 回答