IoC: Como criar objetos dinamicamente
Tenho um problema para entender como usar a IoC em um cenário em que preciso criar objetos dinamicamente. Vamos supor que eu tenho essas classes:
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 ) );
}
}
Então, meu problema é a criação de campos nos construtores. Meus campos precisam de um ICommandStack, mas as entidades não. Eles só recebem o ICommandStack para a criação de seus campos.
Poderia ser mais fácil solicitar os Campos como um argumento no construtor de cada Entidade. Mas o número de campos pode ser> 10 para entidades únicas. Não quero criar construtores com tantos parâmetros.
Então, minha ideia foi entregar uma FieldFactory para os Entites:
class EntityA {
public EntityA( IFieldFactory fieldFactory ) {
// create as many fields as needed via the factory
Fields.Add( fieldFactory.CreateStringField() );
}
}
Pelo menos o ICommandStack (para Entidade) desnecessário agora se foi. Mas como o FieldFactory cria um campo? Ele só pode injetar o ICommandStack - mas a criação de Fields ainda precisa ser feita por meio da palavra-chave 'new'. Ou devo dar à fábrica uma referência ao meu contêiner DI?
O que é uma boa solução de design aqui?