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;
}
}