AuthorizeAttribute,构造函数和停止依赖注入

时间:2014-01-18 20:10:51

标签: asp.net-mvc

我有这个(简化的)控制器设置:

[CustomAuthorizeAttribute]
public class MainController : Controller {}

public class AccountController : MainController 
{
    private IService _iService;

    public AccountController() 
    {
        _service = DependencyFactory.Resolve<IService>(SessionManager.ServiceKey)
    }
    public AccountController(IService service) 
    {
        _service = service;
    }
}

CustomAuthorizeAttribute看起来像:

public CustomAuthorizeAttribute : AuthorizeAttribute 
{
    protected override bool AuthorizeCore(HttpContextBase httpContext)
    {
        bool serviceKeyIsGood = CheckServiceKey(SessionManager.ServiceKey);
        return serviceKeyIsGood;
    }
}

目标是仅在用户通过身份验证时运行帐户控制器,具体情况是“良好”服务密钥的定义。

我遇到的问题是AccountController的构造函数在OnAuthorize运行之前运行,导致服务爆炸(按设计),因为它的服务密钥不好。

管理此问题的最佳方法是什么?我想利用CustomAuthorizeAttribute的简单性,我必须避免重新设计我们的服务实例化的方式。 (并且依赖工厂是必要的,因为MVC抱怨现在有无参数构造函数。)

1 个答案:

答案 0 :(得分:0)

您可以使用factorymethod注入而不是服务本身:

[CustomAuthorizeAttribute]
public class MainController : Controller

public class AccountController : MainController 
{
    private Func<IService> _serviceFactory;

    public AccountController() 
    {
        _serviceFactory= DependencyFactory.Resolve<Func<IService>>(SessionManager.ServiceKey)
    }
    public AccountController(Func<IService> serviceFactory) 
    {
        _serviceFactory= serviceFactory;
    }
}

并使用:在需要时获取服务:service = _serviceFactory()

PS:我建议你在MVC(控制器工厂或内部依赖解析器)中使用DI的标准方法来避免代码_serviceFactory= DependencyFactory.Resolve<Func<IService>>(SessionManager.ServiceKey)