Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/actionscript-3/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 我可以将构造函数参数传递给Unity';s Resolve()方法?_C#_.net_Dependency Injection_Unity Container_Constructor Injection - Fatal编程技术网

C# 我可以将构造函数参数传递给Unity';s Resolve()方法?

C# 我可以将构造函数参数传递给Unity';s Resolve()方法?,c#,.net,dependency-injection,unity-container,constructor-injection,C#,.net,Dependency Injection,Unity Container,Constructor Injection,我正在使用Microsoft的Unity进行依赖项注入,我想这样做: IDataContext context = _unityContainer.Resolve<IDataContext>(); var repositoryA = _unityContainer.Resolve<IRepositoryA>(context); //Same instance of context var repositoryB = _unityContainer.Resolve<I

我正在使用Microsoft的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);
IDataContext上下文=_unityContainer.Resolve();
var repositoryA=\u unityContainer.Resolve(上下文)//同一个上下文实例
var repositoryB=_unityContainer.Resolve(上下文)//同一个上下文实例
IDataContext context2=_unityContainer.Resolve()//新实例
var repositoryA2=_unityContainer.Resolve(context2);
RepositoryA
RepositoryB
都有一个接受
IDataContext
参数的构造函数,我希望Unity使用传递给它的上下文初始化存储库。还请注意,
IDataContext
未向Unity注册(我不想要3个
IDataContext
实例)。

<2美分>

如果您以后决定使用不同的服务,它需要的不仅仅是上下文,还需要更多或更少的内容,该怎么办

构造函数参数和IoC的问题在于,参数最终与所使用的具体类型相关联,而不是作为服务接口定义的契约的一部分

我的建议是,你也可以解决这个问题,我相信团结应该有一种方式来避免你构建它的3个实例,或者你应该考虑一个有助于你构建目标的工厂服务。 例如,如果您以后决定构建一个完全不依赖传统数据库的存储库,而是使用XML文件为测试生成虚拟数据,该怎么办?如何将XML内容提供给该构造函数

IoC是基于解耦代码的,通过将参数的类型和语义绑定到具体的类型,实际上没有正确地进行解耦,仍然存在依赖性

“这段代码可以与任何类型的存储库进行对话,只要它实现了这个接口……哦,并且使用了数据上下文”

现在,我知道国际奥委会的其他容器也支持这一点,我在自己的第一个版本中也有,但在我看来,这不属于解决步骤


诺丹,我想你可能在对拉塞夫克的评论中回答了你自己的问题

首先,我将使用LifetimeManager来管理Unity创建的IDataContext的生命周期和实例数。


听起来像是
ContainerControlled LifetimeManager
对象将为您提供所需的实例管理。有了LifetimeManager,Unity应该将IDataContext的相同实例添加到所有需要IDataContext依赖项的对象中。

非常简短的回答是:没有。Unity目前无法将我能够找到的非常量或注入的参数传递到构造函数中。我想这是它遗漏的最大的一件事,但我认为这是故意的,而不是疏忽

正如杰夫·弗里茨(Jeff Fritz)所指出的,理论上,您可以创建一个定制的生命周期管理器,该管理器知道将哪个上下文实例注入到各种类型中,但这是一个硬编码级别,似乎从一开始就避免了使用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
IDataContext上下文=_unityContainer.Resolve();
_unityContainer.RegisterInstance(上下文);
var repositoryA=_unityContainer.Resolve()//同一个上下文实例
var repositoryB=_unityContainer.Resolve()//同一个上下文实例
//声明单元容器2
IDataContext context2=_unityContainer2.Resolve()//新实例
_unityContainer2.RegisterInstance(上下文2);
var repositoryA2=_unityContainer2.Resolve(context2)//将检索另一个实例

希望这也有帮助

从今天起,他们添加了以下功能:

这是最新的下降在这里:

在此讨论:

例如:

container.Resolve<IFoo>(new ParameterOverrides<Foo> { { "name", "bar" }, { "address", 42 } });"
container.Resolve(新参数覆盖{{“name”,“bar”},{“address”,42});"

根据ResolvedParameter(“名称”)中的注入体系结构,您可以使用InjectionConstructor/InjectionProperty/InjectionMethod来获取容器中预注册对象的实例

在您的情况下,此对象必须注册一个名称,同样,您需要ContainerControlled LifeTimeManager()作为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")));
\u unityContainer.RegisterType(“DataContextA”,新的ContainerControlled LifetimeManager());
_unityContainer.RegisterType(“DataContextB”);
var repositoryA=\u unityContainer.Resolve(新注入构造函数(
新的解析参数(“DataContextA”);
var repositoryB=\u unityContainer.Resolve(新注入构造函数(
新的解析参数(“DataContextA”);
var repositoryA2=\u unityContainer.Resolve(新注入构造函数(
新的解析参数(“DataContextB”);

谢谢大家……我的类似于“存在”的帖子。见下:

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

        _activeDirectoryService = container.Resolve<IActiveDirectoryService>(new ResolverOverride[]
        {
            new ParameterOverride("activeDirectoryServer", "xyz.adserver.com")
        });
IUnityContainer container=newunitycontainer();
container.LoadConfiguration();
_activeDirectoryService=container.Resolve(新的ResolverOverride[]
{
新参数覆盖(“activeDirectoryServer”、“xyz.adserver.com”)
});

我明白您的观点并同意您的观点,但是我仍然需要RepositoryA和RepositoryB的实例具有相同的IDataContext,这需要与RepositoryC不同。另外请注意,IRepositoryA和