Замки Виндзорский завод типовых заводов - PullRequest
7 голосов
/ 06 ноября 2010

обеспечивают ли другие контейнеры .NET IoC функциональность, аналогичную типизированной фабрике в Касл Виндзор?

например. если я использую абстрактный шаблон фабрики в приложении WPF:

public class MyViewModel
{
   private IAnotherViewModelFactory factory;

   public void ShowAnotherViewModel()
   {
      viewController.ShowView(factory.GetAnotherViewModel());
   }
}

Я не хочу создавать ручную реализацию IAnotherViewModelFactory для каждого типа ViewModel, который я хочу показать, я хочу, чтобы контейнер позаботился об этом за меня.

Ответы [ 3 ]

6 голосов
/ 06 ноября 2010

AutoFac имеет функцию под названием Фабрики делегатов , но, насколько я могу судить, он работает только с делегатами, а не с интерфейсами.

Я не встречал ничего похожего на замки.Типизированный Factory Facility ни в StructureMap, ни в Unity, но это не обязательно означает, что их там нет ...


Единственный способ представить, что что-то подобное может быть реализовано для интерфейсов, эточерез динамический прокси.Поскольку в Castle Windsor имеется динамический прокси-сервер, но немногие другие контейнеры имеют что-либо подобное, объяснение того, почему эта функция не повсеместна, может иметь большое значение.

Unity также предлагает возможности перехвата, поэтому он должен иметь какой-то виддинамической реализации прокси, но я уверен, что она не имеет ничего общего с Typed Factories.По сравнению с другими контейнерами Unity довольно прост.

3 голосов
/ 13 ноября 2010

В Autofac вы можете реализовать типизированные фабрики поверх делегатского подхода, о котором упоминает Марк. Э.Г.

class AnotherViewModelFactory : IAnotherViewModelFactory {
    Func<AnotherViewModel> _factory;
    public AnotherViewModelFactory(Func<AnotherViewModel> factory) {
        _factory = factory;
    }
    public AnotherViewModel GetAnotherViewModel() {
        return _factory();
    }
}

Если этот класс зарегистрирован в контейнере вместе с AnotherViewModel Autofac неявно предоставит реализацию Func<AnotherViewModel>:

builder.RegisterType<AnotherViewModel>();
builder.RegisterType<AnotherViewModelFactory>()
    .As<IAnotherViewModelFactory>();

Практически любой интерфейс, который вы можете реализовать с помощью Typed Factory Facility, может быть реализован в Autofac с использованием такого подхода. Основное отличие состоит в том, что реализация Windsor настраивает фабрику через API регистрации компонентов, в то время как в Autofac фабрика сама по себе является компонентом.

Для более сложных примеров вы можете посмотреть: http://code.google.com/p/autofac/wiki/RelationshipTypes и http://nblumhardt.com/2010/01/the-relationship-zoo/.

1 голос
/ 07 декабря 2012

Недавно я реализовал эквивалент замковых заводов Виндзорского типа для Unity. Вы можете найти проект в https://github.com/PombeirP/Unity.TypedFactories, и пакет NuGet в http://nuget.org/packages/Unity.TypedFactories.

Используется следующее:

unityContainer
    .RegisterTypedFactory<IFooFactory>()
    .ForConcreteType<Foo>();

Сопоставление параметров выполняется по имени, что подходит для моих нужд, хотя библиотека может быть легко расширена для поддержки других потребностей.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...