Как вернуть экземпляр на основе его родителя с помощью Simple Injector?

Мы использовали Виндзорский замок в качестве контейнера внедрения, но мы ищем альтернативы. Теперь я добрался до простого инжектора, и до сих пор я был впечатлен его простотой, но один сценарий, на котором я застрял прямо сейчас, — это когда мы используем создание экземпляров с поздней привязкой для некоторых наших компонентов.

Мой первый вопрос, это вообще возможно?

С Виндзором это делается так;

Container.Register(Component.For<ILogger>()
    .UsingFactoryMethod(
        (kernel, componentModel, context) => new Logger(
            context.Handler.ComponentModel.Implementation.Name));

Есть ли способ сделать то же самое с Simple Injector?


person Per    schedule 02.12.2012    source источник


Ответы (1)


С Simple Injector вам просто нужно:

  1. Зарегистрируйте делегата Func явно, используя Register<Func<A, B, C>>((a, b) => { ... })
  2. Создайте интерфейс, такой как ILoggerFactory, добавьте реализацию и зарегистрируйте их.

ОБНОВЛЕНИЕ

Прочитав ваш вопрос еще раз и просмотрев определение UsingFactoryMethod Касла, я пришел к выводу, что неправильно истолковал ваш вопрос. Вам нужно создать экземпляр на основе его родительского типа: Контекстная инъекция< /а>.

Этого можно добиться, внедрив метод расширения внедрения на основе контекста, который предоставляется например, в вики документации Simple Injector.

Когда вы добавляете этот метод расширения в свой проект, вы можете выполнить эквивалентную регистрацию следующим образом:

container.RegisterWithContext<ILogger>(context =>
{
    return new Logger(context.ImplementationType.Name);
});
person Steven    schedule 03.12.2012
comment
Я не думаю, что действительно понимаю, что вы имеете в виду под alt 1. Второй вариант... ну, я хочу, чтобы в моем журнале указывалось, какой класс на самом деле регистрируется, но я не хочу регистрировать один и каждый из регистраторов в завод. На самом деле я пробовал реализацию RegisterWithContext, но есть также сценарий, в котором нам нужно использовать шаблон servicelocator... :-( и тогда это не разрешается. - person Per; 04.12.2012
comment
@Per: извини. Я только что понял, что совершенно неправильно понял ваш вопрос. Я обновил свой ответ. Надеюсь, это ответит на ваш вопрос. Пожалуйста, дайте мне знать, когда это не так. - person Steven; 11.12.2012
comment
Да, вы это сделали, но ваш предыдущий ответ привел меня в правильном направлении. На самом деле я реализовал метод RegisterWithContext. Моя единственная проблема заключается в том, что мне при некоторых обстоятельствах нужно подобрать реализацию с шаблоном ServiceLocator, и к тому времени у меня нет РеализацииType, и вместо этого мне нужно установить имя по умолчанию. Это работает :-) Спасибо - person Per; 12.12.2012