Отвечая на вопросы о внедрении зависимостей здесь, в SO, я почти всегда говорю: «используй фабрику». Я думаю, что ваше решение выглядит довольно хорошо; -)
Возможно, все еще есть место для улучшения.
Поскольку фабрика является статическим типом, у вас нет выбора, кроме как вызвать его непосредственно из кода. Это затрудняет тестирование этого кода (если, конечно, важна тестируемость). То, что вы можете попробовать, это внедрить фабрику как зависимость в используемых вами типах. Поэтому вместо жесткой зависимости от статического типа создайте зависимость от интерфейса. Это может выглядеть так:
public interface IWidgetFactory
{
AbstractWidget CreateWidget(WidgetSpec spec);
}
internal class WidgetFactory : IWidgetFactory
{
// code
}
Теперь вы можете легко зарегистрировать этот тип по его интерфейсу:
<component
service="MyCo.App.IWidgetFactory, MyApp"
type="MyCo.App.WidgetFactory, MyApp"
lifestyle="singleton" />
Теперь вы можете запросить IWidgetFactory
из контейнера или, что еще лучше, добавить аргумент IWidgetFactory
в качестве конструктора для типов, которые должны его использовать:
public class TypeUsingWidgets
{
private IWidgetFactory widgetFactory;
public TypeUsingWidgets(IWidgetFactory widgetFactory)
{
this.widgetFactory = widgetFactory;
}
public void MethodUsingWidgets()
{
var widget = this.factory.CreateWidget("Foo");
}
}
Возможно, это полезно для вашего приложения.