У меня проблема с пониманием того, как использовать 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 для отдельных лиц. Я не хочу создавать конструкторы с таким количеством параметров.
Итак, моя идея состояла в том, чтобы передать FieldFactory Entites:
class EntityA {
public EntityA( IFieldFactory fieldFactory ) {
// create as many fields as needed via the factory
Fields.Add( fieldFactory.CreateStringField() );
}
}
По крайней мере (для Entity) ненужного ICommandStack теперь нет. Но как FieldFactory создает поле? Он может только внедрить ICommandStack, но создание полей все еще должно выполняться с помощью ключевого слова «new». Или я должен дать фабрике ссылку на мой DI-контейнер?
Какое здесь хорошее дизайнерское решение?