1

我不确定如何统一创建命名依赖项以遵循不同的解析路径。所以如果我有

public interface IService
{
    SomeMethod();
}

public class Service : IService
{
    private readonly IRepository repository;
    public Service(IRepository repository)
    {
    this.repository = repository;
    }
    public SomeMethod 
    { 
        //some implementation here
    }
}

在下面我有一个存储库:IRepository、NHibernateContext:INHibernateContext、ISession 等。

我的问题是,如果我在 Global.asax 中做下一步:

container.RegisterType<IService, Service>("GlobalContext");

那么如何让它在“GlobalContext”路径(不使用默认注册类型)中注入 NHibernateContext(或其他一些分层依赖项)?

非常感谢帮助。

4

2 回答 2

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");

应该以您想要的方式构建您的对象图。

于 2013-08-14T21:16:53.300 回答
0

很长一段时间后,我对其他项目也有类似的需求,但使用的是温莎城堡。我现在这样做的方式是,我需要在某些应用程序路径中使用不同的依赖项解析,我会使用子容器。

  1. 创建一个子容器并注册具有不同分辨率的依赖项
  2. 将子容器本身注册为命名实例。
  3. 在入口点(在我的例子中是控制器工厂)检查是否需要通过父容器或子容器解析。如果需要解析子容器并使用它解析层次结构链。如果子容器中不存在注册,它将使用父依赖解析器。
于 2014-11-21T10:36:36.027 回答