我使用微软的Unity依赖注入和我想做的事情是这样的:

IDataContext context = _unityContainer.Resolve<IDataContext>();
var repositoryA = _unityContainer.Resolve<IRepositoryA>(context); //Same instance of context
var repositoryB = _unityContainer.Resolve<IRepositoryB>(context); //Same instance of context

IDataContext context2 = _unityContainer.Resolve<IDataContext>(); //New instance
var repositoryA2 = _unityContainer.Resolve<IRepositoryA>(context2);

RepositoryA RepositoryB都具有一个构造函数的参数IDataContext,我想统一来初始化与我通过它的上下文信息库。还要注意的是IDataContext不使用Unity(我不想IDataContext的3个实例)注册。

有帮助吗?

解决方案

到今天为止他们添加此功能:

这是在最新的放在此处:

http://unity.codeplex.com/SourceControl/changeset/view/33899

论在这里:

http://unity.codeplex.com/Thread/View.aspx?的ThreadId = 66434

示例:

container.Resolve<IFoo>(new ParameterOverrides<Foo> { { "name", "bar" }, { "address", 42 } });"

其他提示

<2美分>

如果您稍后决定使用不同的服务,需要的不仅仅是背景下多还是少?

与构造参数和IOC的问题是,该参数是最终依赖于具体类型被使用,而不是作为该服务接口定义了合同的一部分。

我的建议是,你要么解决的背景下,以及,我相信统一应该有一个方法可以让你避免建造它的3个实例,或者你应该考虑对你构建一个方式工厂服务对象

举例来说,如果你以后决定构建一个不依赖于传统的数据库,在所有的,而是使用一个XML文件来生成虚拟数据的测试库?你会如何去XML内容输送到该构造函数?

的IoC是根据各地去耦代码,在类型和参数的具体类型语义搭售,你真的没有做去耦正确,还是有依赖关系。

“本代码可以跟任何类型的存储库的可能,只要它实现了这个接口....噢,并使用数据上下文”。

现在,我知道其他IoC容器有这种支持,我在我自己的第一个版本有它为好,但在我看来,它不拆分步骤的归属。

谢谢你们......我的是“存在”类似的帖子。见下文:

        IUnityContainer container = new UnityContainer();
        container.LoadConfiguration();

        _activeDirectoryService = container.Resolve<IActiveDirectoryService>(new ResolverOverride[]
        {
            new ParameterOverride("activeDirectoryServer", "xyz.adserver.com")
        });

您可以使用InjectionConstructor / InjectionProperty / InjectionMethod取决于ResolvedParameter (“名称”)内的注射架构来获得在容器中的预登记对象的实例。

在你的情况下,这个对象必须有名称)注册,并为同一insance你需要ContainerControlledLifeTimeManager(作为LifeTimeManager。

_unityContainer.RegisterType<IDataContext,DataContextA>("DataContextA", new ContainerControlledLifeTimeManager());
_unityContainer.RegisterType<IDataContext,DataContextB>("DataContextB");

  var repositoryA = _unityContainer.Resolve<IRepositoryA>(new InjectionConstructor(
new ResolvedParameter<IDataContext>("DataContextA")));

  var repositoryB = _unityContainer.Resolve<IRepositoryB>(new InjectionConstructor(
new ResolvedParameter<IDataContext>("DataContextA")));

  var repositoryA2 = _unityContainer.Resolve<IRepositoryA>(new InjectionConstructor(
new ResolvedParameter<IDataContext>("DataContextB")));

在非常短的答案是:没有。团结目前还没有办法将参数传递到该不恒定或注入的构造,我已经能够找到。恕我直言,这就是它缺少一个最重要的事情,但我认为这是设计而不是遗漏。

杰夫弗里茨指出,理论上你可以创建一个知道要注入不同类型的上下文实例定制一生的经理,但这是硬编码的水平,这似乎是避免在第一使用Unity或DI的目的地点。

您可以从全DI采取退了一小步,让您的存储库的实现负责建立自己的数据环境。上下文的实例的仍然可以从容器但逻辑解决的决定使用哪一个会去到库中的实现。它不是作为纯粹的,肯定的,但它会摆脱这个问题。

您可以使用(真的不知道,如果它是一个很好的做法与否)另一种方法是创建两个容器并为每个注册的实例:

IDataContext context = _unityContainer.Resolve<IDataContext>();
_unityContainer.RegisterInstance(context);
var repositoryA = _unityContainer.Resolve<IRepositoryA>(); //Same instance of context
var repositoryB = _unityContainer.Resolve<IRepositoryB>(); //Same instance of context


//declare _unityContainer2
IDataContext context2 = _unityContainer2.Resolve<IDataContext>(); //New instance
_unityContainer2.RegisterInstance(context2);
var repositoryA2 = _unityContainer2.Resolve<IRepositoryA>(context2); //will retrieve the other instance

希望这有助于太

NotDan,我觉得你可以在注释中lassevk已经回答了你自己的问题。

首先,我会用LifetimeManager管理IDataContext团结创建的实例的生命周期和数量。结果 http://msdn.microsoft.com/en-us/library/cc440953。 ASPX

这听起来像ContainerControlledLifetimeManager对象会给你你需要的实例管理。随着地方LifetimeManager,统一应IDataContext的同一实例添加到需要IDataContext依赖的所有对象。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top