Asp.net mvc AuthorizeAttribute、构造函数和停止依赖项注入

Asp.net mvc AuthorizeAttribute、构造函数和停止依赖项注入,asp.net-mvc,Asp.net Mvc,我有这个简化的控制器设置: [CustomAuthorizeAttribute] public class MainController : Controller {} public class AccountController : MainController { private IService _iService; public AccountController() { _service = DependencyFactory.Resol

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

[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;
    }
}
目标是仅当用户通过身份验证时才运行account controller,这是由良好服务密钥的存在所定义的

我遇到的问题是AccountController的构造函数在OnAuthorize运行之前运行,这会导致服务在设计上崩溃,因为它的服务密钥是坏的


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

您可以使用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:service=\u serviceFactory


PS:我建议您在MVC控制器工厂或内部依赖解析程序中使用DI的标准方法,以避免使用诸如_serviceFactory=DependencyFactory.ResolveSessionManager.ServiceKey之类的代码。我同意DI是一种方法,但出于某种原因,MVC不喜欢使用无参数构造函数。我很难确定为什么…团结决议应该为我们解决这个问题,但这不是出于某种原因…这是一个单独的SO帖子。使用无参数构造函数满足MVC的抱怨,而使用DI构造函数则允许进行测试。服务工厂是一个有趣的方法,但我们必须重新连接Unity容器。由于用户被踢出,出于安全原因,我们最终接受了失败的解析错误。如果在容器中注册了T,Unity容器可以从框中解析Func
[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;
    }
}