Как передать аргументы конструктору в IOC-рамках

Как передать аргументы конструктору в IOC-framework? Я хочу сделать что-то вроде: (Попытка быть агностиком IOC-framework;))

object objectToLogFor = xxx;
container.Resolve<ILogging>(objectToLogFor); 

public class MyLogging : ILogging
{
    public MyLogging(object objectToLogFor){}
}

Кажется, что это невозможно в StructureMap. Но я хотел бы видеть, как кто-то доказывает мне свою несостоятельность.

Являются ли другие структуры более многофункциональными? Или я использую схему IOC неправильно?

Ответ 2

Для замка Виндзор:

var foo = "foo";
var service = this.container.Resolve<TContract>(new { constructorArg1 = foo });

Обратите внимание на использование анонимного объекта для указания аргументов конструктора.

с помощью StructureMap:

var foo = "foo";
var service = container.With(foo).GetInstance<TContract>();

Ответ 3

Как это может быть язык-агностик? Это деталь реализации рассматриваемой структуры.

Spring позволяет вам указать c'tor args как список значений/ссылок, если это ваша вещь. Это не очень читаемо, однако, по сравнению с введением свойств.

Некоторые люди горят под ошейником, и настаивают на том, что инъекция c'tor является единственным поточно-безопасным подходом в java. Технически они правильные, но на практике это не имеет значения.

Ответ 4

Это не должно быть очень распространенной потребностью, но иногда она действительна. Ninject, который легче, чем StructureMap, позволяет передавать параметры при извлечении переходных объектов из контекста. Spring.NET.

В большинстве случаев объекты, объявленные в контейнере IoC, не являются временными и принимают другие непереходные объекты через конструкторы/свойства/методы в качестве зависимостей.

Однако, если вы действительно не используете контейнер как factory, и если у вас достаточно контроля над объектами, которые вы хотите разрешить, вы можете использовать инъекцию свойств или методов, даже если это звучит менее естественно и более в некотором роде.

Ответ 5

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

Ответ 6

Другие рамки IoC более функциональны.

т.е. проверьте ParameterResolution с Autofac

Ответ 7

Вы также можете сделать это с помощью Windsor легко