C# IoC:如何动态创建对象
在需要动态创建对象的场景中,我很难理解如何使用IoC。假设我有这样的类:C# IoC:如何动态创建对象,c#,inversion-of-control,C#,Inversion Of Control,在需要动态创建对象的场景中,我很难理解如何使用IoC。假设我有这样的类: abstract class Field { public Field( ICommandStack commandStack ) {} } abstract class Entity { public readonly Collection<Field> Fields { get; } } class EntityA { public EntityA( ICommandStack comman
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现在已消失。但是FieldFactory如何创建字段呢?它只能注入ICommandStack,但字段的创建仍然需要通过“new”关键字完成。或者我应该给工厂一个我的DI容器的参考
这里什么是好的设计解决方案?在Spring(和Spring.NET)中,有一个“原型范围”bean/对象的概念
与注入固定对象并将它们连接在一起不同,prototype作用域将在任何时候从IoC容器请求该对象时创建该对象的新实例。我不确定您使用的是什么DI框架,但它可能有类似的东西。我会使用一个FieldFactory,并向工厂注入对容器的引用(或者如果您不满意对容器的强烈依赖,则注入对容器进行抽象的接口) 否则,一路上都是海龟。您需要一些对象来在某个时刻向容器请求一个新实例。如果您希望字段被DI注入,那么您需要请求容器来构建它们或您自己
总而言之,我会和工厂一起去。但我在哪里以及如何提出要求?FieldFactory仍然需要对容器的引用来请求对象。
class EntityA {
public EntityA( IFieldFactory fieldFactory ) {
// create as many fields as needed via the factory
Fields.Add( fieldFactory.CreateStringField() );
}
}