我正在.Net核心中编写一个控制台应用程序。我想使用依赖注入。我的架构是这样的。程序包含一个TradeProcessor(完成所有工作),后者又生成一些CompoundTrades。我有DI通过其构造函数和整个ServiceProvider设置将一些类传递给TradeProcessor。这很好。
现在,如果我想将DI中的一些类转化为CompoundTrade,那么TradeProcessor是否必须通过构造函数传递它们?我的印象是,如果您注册要构建的课程,所有要传入的课程,那么他们都会被传入"引擎盖下#34;。你调用CompoundTrade(),但调用另一个构造函数。我在Asp.Net中与DI混淆了吗?这样做的最佳设计模式是什么?将所有ServiceProviders粘贴在静态类中?
答案 0 :(得分:1)
你调用CompoundTrade(),但调用另一个构造函数。
不依赖注入的工作方式。如果显式调用构造函数,则完全该构造函数。
您需要引用容器并告诉您的容器为您创建该类的实例。
如果您有一个需要动态创建在容器中注册的新对象的实例,则需要传入容器,然后使用它来创建这些新对象。不要直接调用构造函数。
public TradeProcessor(IServiceProvider provider)
{
// save the provider in a field
}
public void ThisNeedsADynamicallyCreatedContainerObject()
{
if(condition)
{
var instance = this.provider.GetService<ICompoundTrade>();
}
else
{
var instance = this.provider.GetService<ISingleTrade>();
}
}
免责声明:实际语法可能因您使用的依赖注入提供程序而异。