我不确定如何使用unity来命名依赖于不同的解析路径。所以,如果我有
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(或其他一些层次依赖关系)(不使用默认的注册类型)?
非常感谢。
答案 0 :(得分:2)
使用这样的命名注册时,您不能再依赖自动布线,因此您需要更加具体地注册。所以假设你有这些:
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");
应该按照你想要的方式构建你的对象图。
答案 1 :(得分:0)
过了一段时间,我对其他一些项目有类似的需求,但是正在使用Castle Windsor。我现在要这样做,我需要在某些应用程序路径中使用不同的依赖项解析,我会使用子容器。