我正在使用 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 正在尝试解析控制器,然后在会话构建之前解析服务。
难道我没有正确思考这个问题吗?每一步都感觉非常合理——在服务中使用会话凭据,在控制器中使用服务,使用解析器来帮助构建控制器——但我一直在绞尽脑汁地让这一切发挥作用。