Arrrgh!我正在这里拉我的头发。我一直在尝试使用IoC容器,并且一切看起来都很好,并且很棒,直到遇到一些您认为非常基本的问题,例如将参数传递给构造函数。如何在使用IoC容器时将参数传递给构造函数?
说我有与引用类可以由IOC和值类型(或一些其他类型的)来解决的混合某处的类,它可以只在运行时被解决:
public NFLFeedUnitOfWork(NFLFileType fileType, object feed, IConverterMappings<NFLFileType> nflConverterMappings, IDbContext context)
: base(fileType, feed, nflConverterMappings, context, ContextType.NFL)
{
//new NFLContext(connstringname, setAutoDetectChanges)
}
在该特定示例我传入枚举(NFLFileType),对象实例,2个接口参数,并将一个额外的硬编码属性传递给基础构造函数(ContextType.NFL)
如何在任何IoC容器中都可以做到这一点?
这个问题实际上是2倍:
1)如何在其仅在运行时已知的物体通过了吗?举例来说,此时的呼叫代码如下所示:
protected override IFeedUnitOfWork GetUnitOfWork(NFLFileType fileType, object feed, string connectionString)
{
return new NFLFeedUnitOfWork(fileType, feed, new NFLConverterMappings(), new NFLContext(connectionString));
}
如何将此代码转换为使用IoC? 也许是这样的?
protected override IFeedUnitOfWork GetUnitOfWork(NFLFileType fileType, object feed, string connectionString)
{
return IFLFeedUnitOfWork(fileType, feed);
}
哪里最后2个参数自动解决,并且自己提供1st 2 I?
2.)我如何传入枚举,对象,值类型到构造函数使用IoC? (或者可能不会在这个特定的情况下使用它?)
无论如何,任何帮助非常感谢,特别是在第一点。 此刻我正在使用Unity,但任何其他IoC容器也不错。
我不想将IoC容器传入代码中,我只想在顶层的一个地方指定它。
+1。这显示了OP的痛点并提供了很好的建议。 Unity还可以提供ResolverOverrides,以便在解析时覆盖现有注册(如[使用覆盖解析对象](https://msdn.microsoft.com/en-us/library/ff660920(v = pandp 0.20)的.aspx))。我毫不犹豫地提到这一点,因为我认为上述建议应该是第一种方法。 –
这样一个很好的答案!非常感谢Steven,这绝对回答了我的大部分问题,并指出了我的正确方向。但是你能澄清一下吗?在案例1提供的例子中,我们基本上为调用'GetUnitOfWork'方法的类创建了一个Provider。然而,在'GetUnitOfWork'本身的实现中,我们仍然将仅在运行时已知的2个值传递给'new NFLFeedUnitOfWork(...'这是否意味着我还需要为'NFLFileType fileType'和'object创建另外2个提供者(这似乎有点太多,1个运行时值的提供者) – Tanuki
@Tanuki:我无法回答这个问题,我不知道那些vakues是什么,以及它们是如何确定的。与这方面的信息,我会尝试看看。 – Steven