C# 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

在需要动态创建对象的场景中,我很难理解如何使用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现在已消失。但是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() );
  }
}