简单的注入器参数覆盖

时间:2017-01-23 23:41:44

标签: c# dependency-injection simple-injector

我正在尝试确定在解析类型时如何注入特定的服务实例。

例如,对于Unity,我可能会执行以下操作:

IFoo fooService = Container.Resolve<IFoo>();
fooSerivce.DoBar( "someParameter" );
ParameterOverrides overrides = new ParameterOverrides()
{
    { "fooService", fooService }
};
return Container.Resolve( type, overrides );

如何使用Simple Injector完成此操作?

1 个答案:

答案 0 :(得分:1)

简单注射器没有内置支持来提供容器的解决方案&#39;方法,因为这是一个坏主意,因为它的主要用例是为注入构造函数提供运行时数据。构建应用程序组件取决于运行时数据是一种反模式,详见here

有一些罕见的情况虽然你可以解决这个问题,但这主要发生在与你无法控制的第三方库或框架集成时。你可能会在Prism中遇到这样的情况,它似乎是围绕页面和导航服务之间的循环依赖而设计的,这是棱镜这样做的主要原因。

你应该看一下this特定的Q&amp; A。它谈到了WebFromsMvp,它具有与Prism相同的设计怪癖。问题和答案描述了使用Simple Injector非常有效地解决这个问题的方法。

<强>更新

从您在问题中显示的示例中,似乎根本不需要使用覆盖,因为您注入了已从容器中解析的服务。相反,您可以执行以下操作:

IFoo fooService = Container.GetInstance<IFoo>();
fooSerivce.DoBar("someParameter");
return Container.GetInstance(type);

只要IFoo注册ScopedSingleton生活方式,type在其构造函数中接受IFoo,就会注入相同的实例转发type