我在理解如何在需要动态创建对象的场景中使用 IoC 时遇到问题。让我们假设我有这个类(class):
abstract class Field {
public Field( ICommandStack commandStack ) {}
}
abstract class Entity {
public readonly Collection<Field> Fields { get; }
}
class EntityA {
public EntityA( ICommandStack commandStack ) {
Fields.Add( new StringField( commandStack ) );
}
}
class EntitiyB {
public EntityB( ICommandStack commandStack ) {
Fields.Add( new IntField( commandStack ) );
Fields.Add( new IntField( commandStack ) );
Fields.Add( new IntField( commandStack ) );
}
}
所以我的问题是在构造函数中创建字段。我的字段需要 ICommandStack,但实体不需要。他们只获得 ICommandStack 以创建他们的字段。
在每个实体的构造函数中请求字段作为参数可能会更容易。但是单个实体的字段数量可能 >10。我不想创建具有这么多参数的构造函数。
所以我的想法是将 FieldFactory 移交给实体:
class EntityA {
public EntityA( IFieldFactory fieldFactory ) {
// create as many fields as needed via the factory
Fields.Add( fieldFactory.CreateStringField() );
}
}
至少(对于实体)不必要的 ICommandStack 现在不见了。但是 FieldFactory 是如何创建 Field 的呢?它只能注入(inject) ICommandStack - 但字段的创建仍需通过“new”关键字完成。或者我应该向工厂提供对我的 DI 容器的引用?
什么是好的设计解决方案?
最佳答案
我会使用 FieldFactory 并在工厂中注入(inject)对容器的引用(如果您不满意对容器的强依赖性,则注入(inject)一个抽象它的接口(interface))。
否则一路下去都是乌龟。您需要一些对象在某个时候向容器请求一个新实例。如果你想让你的字段被 DI 注入(inject),那么你需要让容器来构建它们或你。
总而言之,我会选择工厂。
关于c# - 国际奥委会 : How to create objects dynamically,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/820520/