Привет всем.
Имеется .NET приложение, использующее Unity. Возникла необходимость в фабрике объектов — что-то вроде "Абстрактной фабрики" в терминологии GoF.
Конструкторы объектов, которые должна создавать фабрика, можно разделить на категории:
1) "глобальные" сервисы, доступны через IoC-контейнер
2) конфигурационные параметры, их значения определяются при создании фабрики и не должны быть видимы использующему фабрику коду
3) параметры, указываемые при создании объекта, должны быть переданы в метод фабрики
Как реализовать подобную фабрику?
Возможно, у данной задачи есть другое решение?
Покажу псевдокодом.
// Интерфейс фабрики
public interface IFactory<T>
{
// Методы для создания и конфигурирования фабрики
}
// Пример объекта, который должна создавать фабрика
public sealed class Foo : IFoo
{
public Foo(
IService service, // Значение этого параметра нужно получать из Unity
String param, // Значение этого параметра узнаём при конфигурации фабрики
Context context) // Значение этого параметра становится известно только перед созданием объекта
{
...
}
}
// Использование фабрики, в каком-либо классе
public class Bar
{
public IFactory<IFoo> Factory {get; set};
public void SomeMethod()
{
Context fooContext = ...; // Значение третьего параметра
IFoo foo = this.fooFactory.????? // Код создания объекта
...
}
}
// Создание и конфигурирование фабрики, при запуске приложения
String paramValue = ...; // Значение второго параметра
Factory<IFoo> factory = new Factory<IFoo>(???); // Код создания и
??????? // конфигурирования фабрики
Bar bar = ...;
bar.FooFactory = factory;