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