Украшение именованных компонентов в виндзоре

1

Моя сборка содержит несколько реализаций IFoo. Одна из этих реализаций - декоратор FooDecorator. Кроме того, у меня есть FooFactory, который я хотел бы разрешить для всех Foos, украшенных FooDecorator. Я предположил, что лучшим способом будет решение компонентов по имени. Моя текущая регистрация выглядит так:

Component.For<IFooFactory>()
    .ImplementedBy<WindsorFooFactory>()
    .LifestyleSingleton(),
Component.For<IFoo>()
    .ImplementedBy<FooDecorator>(),
AllTypes.FromThisAssembly()
    .BasedOn<IFoo>()
    .Configure(c => c
        .Named(c.Implementation.Name))));

И реализация фабрики выглядит так:

public class WindsorFooFactory : IFooFactory
{
    private readonly IKernel _container;

    public WindsorFooFactory(IKernel container)
    {
        _container = container;
    }

    public IFoo NewFoo(Type fooType)
    {
        return _container.Resolve<IFoo>(fooType.Name);
    }

    public void ReturnFoo(IFoo foo)
    {
        _container.ReleaseComponent(foo);
    }
}

Поэтому, если моя сборка содержит Foo1, Foo2 и FooDecorator, у меня должны быть такие регистрации:

  1. компонент для IFoo, реализованный FooDecorator
  2. компонент для IFoo, реализованный Foo1 с именем Foo1
  3. компонент для IFoo, реализованный Foo2 с именем Foo2
  4. // компонент для IFoo, реализованный FooDecorator с именем FooDecorator <- не уверен в этом, так как это дубликат

Теперь мой завод будет решать такие компоненты, как:

container.Resolve("Foo1")

И я хотел бы получить Foo1, украшенный FooDecorator. Есть ли способ добиться такого украшения? Я делаю что-то неправильно?

Теги:
inversion-of-control
castle-windsor

1 ответ

1

Если вы решили использовать перехватчик, чтобы конфигурация работала для вас

container.Register(
    Component.For<FooInterceptor>(),
    Classes.FromAssembly()
        .BasedOn<IFoo>()
        .Configure(c => c.Interceptors<FooInterceptor>())
        .Configure(c => c.Named(c.Implementation.Name)));

Конечно, вы должны реализовать свой FooInterceptor, реализующий IInterceptor

Вы должны также рассмотреть возможность замены своей фабрики TypedFactory

  • 0
    Мне очень нравится это решение, к сожалению, мне нужно использовать декоратор. +1 за печатный завод, классная вещь.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню