我正在使用 MVC4 和 Unity 2.1。我的服务需要基于从会话状态检索到的凭据的服务密钥。
我像这样注册我的服务:
container.RegisterType<IInventoryService, InventoryService>();
InventoryService 的构造函数同样简单:
public InventoryService(ServiceKey serviceKey) { ... }
在我的网站中,当我需要一项服务时,我会使用一个服务定位器,它使用会话中的凭据自动组成服务密钥。
public static T Resolve<T>(ServiceKey serviceKey = null)
{
if (serviceKey == null)
{
serviceKey = SessionManager.ServiceKey;
}
var parameterOverride = new ParameterOverride(SERVICEKEY_PARAMETERNAME, serviceKey);
return Resolve<T>(null, parameterOverride);
}
这运作良好。问题是我现在将我的站点转换为 MVC 并尝试使用一个简单的依赖解析器将服务注入控制器,该依赖解析器使用我现有的服务定位器(依赖工厂):
public class CustomDependencyResolver : IDependencyResolver
{
public object GetService(Type serviceType)
{
return MvcDependencyFactory.Resolve(serviceType);
}
public IEnumerable<object> GetServices(Type serviceType)
{
return MvcDependencyFactory.ResolveAll(serviceType);
}
}
我的控制器看起来像:
public InventoryController(IInventoryService inventoryService) { ... }
问题是 MVC 在尝试实例化库存控制器时仍然抱怨找不到无参数构造函数。我认为这是因为我没有在 Unity 中注册服务密钥。但是如果我尝试这样做,我发现 MVC 正在尝试解析控制器,然后是服务,甚至在会话构建之前。
我没有正确地考虑这一点吗?每一步都感觉很合理——在服务中使用会话凭据,在控制器中使用服务,使用解析器帮助构建控制器——但我一直在努力让这个工作正常进行。