所有人!
我在使用MVC3 IDependencyResolver解析Unity2.0中的命名注册时遇到了问题。
我将类型注册配置为
public class Implementations
{
private IUnityContainer unityContainer;
internal Implementations()
{
this.unityContainer = new UnityContainer();
}
public static IUnityContainer GetUnityContainer()
{
Implementations implementations = new Implementations();
implementations.RegisterImplementations();
return implementations.unityContainer;
}
private void RegisterImplementations()
{
this.unityContainer
.RegisterType<IService, TestService>()
.RegisterType<IService, TestService2>("ts2");
}
}IDependencyResolver的代码是
public class UnityDependencyResolver : IDependencyResolver
{
IUnityContainer container = null;
string namedRegistration = null;
public UnityDependencyResolver(IUnityContainer container, string name)
{
this.container = container;
this.namedRegistration = name;
}
public object GetService(Type serviceType)
{
try
{
return this.container.Resolve(serviceType, this.namedRegistration);
}
catch
{
return null;
}
}
public IEnumerable<object> GetServices(Type serviceType)
{
try
{
return this.container.ResolveAll(serviceType);
}
catch
{
return new List<object>();
}
}
}而Application_Start中的方法调用是
protected void Application_Start()
{
var dependency =
new UnityDependencyResolver(Implementations.GetUnityContainer(), "ts2");
DependencyResolver.SetResolver(dependency);
AreaRegistration.RegisterAllAreas();
RegisterGlobalFilters( GlobalFilters.Filters );
RegisterRoutes( RouteTable.Routes );
}我想要做的是,无论是在UnityDependencyResolver中还是以任何其他方式,如果命名实例不存在,则解析我的命名实例或默认实例。当前代码始终解析为默认实例(没有命名实例)。
有没有人知道怎么做?
谢谢。
发布于 2011-08-26 16:16:24
据我所知,您尝试将IService注入到一些控制器中:
public class HomeController : Controller
{
private IService _service;
public HomeController(IService service)
{
_service = service;
}
// ..
}然后您可以这样做(您应该显式地为每个控制器分配命名实例):
private void RegisterImplementations()
{
_unityContainer
.RegisterType<IService, Service1>()
.RegisterType<IService, Service2>("ts2")
.RegisterType<HomeController>(new InjectionConstructor(new ResolvedParameter<IService>("ts2")));
}您不应该将注册名称传递给mvc解析器,因为它是没有意义的(我们只有一种(默认命名的)控制器类型):
public class UnityDependencyResolver : IDependencyResolver
{
private readonly IUnityContainer container;
public UnityDependencyResolver(IUnityContainer container)
{
this.container = container;
}
#region IDependencyResolver Members
public object GetService(Type serviceType)
{
try
{
return container.Resolve(serviceType);
}
catch
{
return null;
}
}
// ..
}PS为什么你需要一些IService - default和named的实例?
https://stackoverflow.com/questions/7196385
复制相似问题