Когда вы используете шаблон фабрики, как вы добавляете зависимости в конструкторы во время выполнения?Как реализовать инжектор конструктора на заводе?
Я создаю Foos с различными форматами - булевыми, массивными, freetext, матрицами и т. Д. Этот формат будет расти, поскольку мы найдем для Foo разные виды использования. Вот мой основной основной домен:
public interface IFoo
{
FooFormat Format { get; }
}
public class Foo : IFoo
{
private FooFormat _format;
internal Foo(FooFormat format)
{
_format = format;
}
public FooFormat Format { get { return _format; } }
}
public abstract class FooFormat
{
}
public class DefaultFooFormat : FooFormat
{
}
public class BooleanFooFormat : FooFormat
{
public IList<bool> Values { get; set; }
}
public class ArrayFooFormat : FooFormat
{
private IList<string> _values;
public ArrayFooFormat(IList<string> values)
{
_values = values;
}
public IList<string> Values { get { return _values; } }
}
IFoo оформлен в контексте потребительского:
public abstract class FooDecorator : IFoo
{
private IFoo _foo;
protected FooDecorator(IFoo foo)
{
_foo = foo;
}
public FooFormat Format
{
get { return _foo.Format; }
}
protected IFoo foo
{
get { return _foo; }
}
}
Я не хочу, чтобы потребитель, чтобы создать экземпляр Foo непосредственно, поэтому я заставить их использовать завод:
public abstract class FooFactory
{
protected IFoo Build<T>()
{
FooFormat format = GetFormat<T>();
return new Foo(format);
}
private FooFormat GetFormat<T>()
{
if (typeof(T) == typeof(ArrayFooFormat)) return new ArrayFooFormat(new List<string>());
if (typeof(T) == typeof(BooleanFooFormat)) return new BooleanFooFormat();
return new DefaultFooFormat();
}
}
И даже тогда они должны получить фабрику из моей абстрактной фабрики для их конкретного контекста.
Я специально строить FOOS в контексте HTML, например, так:
public class HtmlFoo : FooDecorator
{
public HtmlFoo(IFoo foo) : base(foo) { }
public string ToHtml()
{
return "<div>" + this.Format.ToString() + "</div>";
}
}
public class HtmlFooFactory : FooFactory
{
public IFoo BuildFoo<T>()
{
IFoo foo = Build<T>();
return new HtmlFoo(foo);
}
}
public class HtmlFooConsumer
{
public void DoSomeFoo()
{
var factory = new HtmlFooFactory();
var htmlBooleanFoo = factory.BuildFoo<BooleanFooFormat>();
var htmlArrayFoo = factory.BuildFoo<ArrayFooFormat>();
}
}
Моя проблема заключается в моем абстрактном FooFactory: Я всегда нагнетание пустой список значений в мой ArrayFooFormat. Я хочу, чтобы иметь возможность передать в список значений от потребителя. Для других FooFormats я хочу передать правильные аргументы конструктора от потребителя. Но я хочу, чтобы публичный API был прост - мне не нужно куча перегрузок на BuildFoo().
Так как я могу передать пользовательский список значений на фабрику.BuildFoo <T>() звонок изнутри HtmlFooConsumer.DoSomeFoo()? Любые идеи, гуру stackoverflow?
в таких сложных вопросах, как это действительно помогает иметь более реальный пример, а не пучок Foo-ey. – Bryan