我无法理解如何在需要动态创建对象的场景中使用 IoC。假设我有这样的课程:
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。我不想创建带有这么多参数的构造函数。
所以我的想法是将一个现场工厂移交给实体:
class EntityA {
public EntityA( IFieldFactory fieldFactory ) {
// create as many fields as needed via the factory
Fields.Add( fieldFactory.CreateStringField() );
}
}
至少(对于实体)不必要的 ICommandStack 现在已经消失了。但是FieldFactory是如何创建Field的呢?它只能注入 ICommandStack - 但字段的创建仍然需要通过“new”关键字来完成。或者我应该向工厂提供我的 DI 容器的参考信息?
这里有什么好的设计解决方案?
我将使用 FieldFactory 并通过对容器的引用注入工厂(或者如果您不满意对容器的强烈依赖,则注入抽象它的接口)。
不然的话,就只能是乌龟了。您需要一些对象在某个时刻向容器请求新实例。如果您希望您的字段被 DI 注入,那么您需要要求容器来构建它们或您。
总而言之,我会选择工厂。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)