gpt4 book ai didi

c# - 使用 MVC3 IDependencyResolver 从 Unity 2.0 解析命名注册

转载 作者:行者123 更新时间:2023-11-30 18:03:23 25 4
gpt4 key购买 nike

各位!

我在使用 MVC3 IDependencyResolver 从 Unity 2.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 还是任何其他方式中,我想做的是解析我的命名实例或默认实例(如果命名不存在)。当前代码始终解析为默认实例(无命名实例)。

有人知道怎么做吗?

谢谢。

最佳答案

据我了解,您尝试使用 IService 注入(inject)某些 Controller :

public class HomeController : Controller
{
private IService _service;

public HomeController(IService service)
{
_service = service;
}
// ..
}

然后你可以这样做(你应该为每个 Controller 显式分配命名实例):

private void RegisterImplementations()
{
_unityContainer
.RegisterType<IService, Service1>()
.RegisterType<IService, Service2>("ts2")
.RegisterType<HomeController>(new InjectionConstructor(new ResolvedParameter<IService>("ts2")));
}

并且您不应该将注册名称传递给 mvc 解析器,因为它没有意义(我们只有一种(默认命名的) Controller 类型):

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 实例 - 默认和命名?

关于c# - 使用 MVC3 IDependencyResolver 从 Unity 2.0 解析命名注册,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7196385/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com