Unity IoC-解析命名依赖不同路径
本文关键字:依赖 路径 IoC- Unity | 更新日期: 2023-09-27 18:27:26
我不知道如何创建具有统一性的命名依赖项以遵循不同的解析路径。所以如果我有
public interface IService
{
SomeMethod();
}
public class Service : IService
{
private readonly IRepository repository;
public Service(IRepository repository)
{
this.repository = repository;
}
public SomeMethod
{
//some implementation here
}
}
下面我有一个Repository:IRepository,NHibernateContext:INHibernateContext,ISession等
我的问题是,如果我在Global.asax:中做下一步
container.RegisterType<IService, Service>("GlobalContext");
那么我如何让它在"GlobalContext"路径中注入NHibernateContext(或其他层次依赖项)(不使用默认的注册类型)?
非常感谢您的帮助。
当使用这样的命名注册时,您不能再依赖于自动连接,因此您需要更加具体地进行注册。所以假设你有这些:
container.RegisterType<INHibernateContext, NHibernateContext>("GlobalContext");
container.RegisterType<ISession, NHibernateSession>("GlobalContext");
当您解析IRepository"GlobalContext"时,您希望注入那些特定的依赖项。假设你有一个接受这两个参数的构造函数,你可以明确地告诉容器你想使用哪个名称:
container.RegisterType<IRepository, Repository>("GlobalContext",
new InjectionConstructor(
new ResolvedParameter<INHibernateContext>("GlobalContext"),
new ResolvedParameter<ISession>("GlobalContext")
)
);
这告诉容器使用采用INHibernateContext和ISession的构造函数,通过容器解析这些参数,并在解析它们时使用GlobalContext名称。
同样,连接您的服务:
container.RegisterType<IService, Service>("GlobalContext",
new ResolvedParameter<IRepository>("GlobalContext")
);
最后的解决方案:
container.Resolve<IService>("GlobalContext");
应该按照您想要的方式构建对象图。
过了很长一段时间,我对其他项目也有类似的需求,但使用的是温莎城堡。按照我现在的做法,假设我需要在某些应用程序路径中使用不同的依赖项解析,我会使用一个子容器。
- 创建子容器并注册具有不同分辨率的依赖项
- 将子容器本身注册为命名实例
- 在入口点(在我的例子中是控制器工厂)检查是否需要通过父容器或子容器进行解析。如果需要,解析子容器并使用它解析层次结构链。如果子容器中不存在注册,则使用父依赖关系解析程序