我有这个(简化的)控制器设置:
[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抱怨现在有无参数构造函数。)
答案 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)