Замок Виндзор - Инъекция метода поиска для переходных процессов - PullRequest
1 голос
/ 27 октября 2010

Краткий вопрос:
Есть ли в Castle Windsor что-то похожее на «инъекцию метода поиска» в Spring.Net, которую можно настроить из XML, что дает возможность извлекать временные экземпляры из контейнера без уведомления класса о контейнере IoC?

Длинный вопрос:
Я долгое время пользуюсь Spring / Spring.Net, и я экспериментировал с Castle Windsor, пытаясь перенести на него проект. Spring.Net имеет концепцию «инъекции метода поиска», которая (из документов Spring) ...

Внедрение метода поиска - это способность контейнера переопределять методы в управляемых объектах контейнера, чтобы возвращать результат поиска другого именованного объекта в контейнере. Поиск обычно включает объект-прототип, как в сценарии, описанном в предыдущем разделе. Среда Spring реализует внедрение этого метода путем динамического создания подкласса, переопределяющего метод с использованием классов в пространстве имен System.Reflection.Emit.

Что это значит, если бы у меня было следующее ...

public class SomeTransient
{
    // ... I have dependencies that need to be filled by IoC container
}

public class SomeClass
{
    public virtual void Work()
    {
        var o = CreateTransient();
    }

    public virtual SomeTransient CreateTransient() { }
}

Я могу поручить Spring переопределить метод CreateTransient и заставить этот метод возвращать новый созданный контейнером временный экземпляр (с инициализированными его зависимостями) при каждом вызове метода. Уникальной частью этого является то, что он не требует прямых ссылок на Spring Framework (например, SomeClass не должен реализовывать определенный интерфейс).

Есть ли что-то похожее в замке Виндзор, чтобы сделать это через XML?

(в конце концов я отойду от конфигурации XML, но сейчас я просто пытаюсь запустить его)

1 Ответ

2 голосов
/ 27 октября 2010

В замке есть что-то лучше; Типизированные Фабрики. Вы также можете ввести даже делегат! http://stw.castleproject.org/Windsor.Typed-Factory-Facility-delegate-based-factories.ashx

Лучше, потому что он не зависит от динамически генерируемого кода и выглядит намного чище.

Это выглядит намного чище, потому что класс не зависит от того, кто переопределит этот метод. Невозможно проверить этот класс без подклассов.

Если вы действительно хотите сделать что-то подобное, я бы ожидал:

public abstract class SomeClass
{
  public abstract SomeTransient CreateTransient();
}

но ... опять же это нехорошо.

Редактировать 2

Unity 2 поддерживает такого рода фабрики делегатов; Вы можете прочитать больше здесь: http://www.truewill.net/myblog/index.php/2010/05/06/unity_2_0_combining_injectionfactory_and

благодаря @ eiximenis

...