Ответ 1
В структурной карте вы можете достичь этого с помощью метода With:
string objectToLogFor = "PolicyName";
ObjectFactory.With<string>(objectToLogFor).GetInstance<ILogging>();
Как передать аргументы конструктору в IOC-framework? Я хочу сделать что-то вроде: (Попытка быть агностиком IOC-framework;))
object objectToLogFor = xxx;
container.Resolve<ILogging>(objectToLogFor);
public class MyLogging : ILogging
{
public MyLogging(object objectToLogFor){}
}
Кажется, что это невозможно в StructureMap. Но я хотел бы видеть, как кто-то доказывает мне свою несостоятельность.
Являются ли другие структуры более многофункциональными? Или я использую схему IOC неправильно?
В структурной карте вы можете достичь этого с помощью метода With:
string objectToLogFor = "PolicyName";
ObjectFactory.With<string>(objectToLogFor).GetInstance<ILogging>();
Для замка Виндзор:
var foo = "foo";
var service = this.container.Resolve<TContract>(new { constructorArg1 = foo });
Обратите внимание на использование анонимного объекта для указания аргументов конструктора.
с помощью StructureMap:
var foo = "foo";
var service = container.With(foo).GetInstance<TContract>();
Как это может быть язык-агностик? Это деталь реализации рассматриваемой структуры.
Spring позволяет вам указать c'tor args как список значений/ссылок, если это ваша вещь. Это не очень читаемо, однако, по сравнению с введением свойств.
Некоторые люди горят под ошейником, и настаивают на том, что инъекция c'tor является единственным поточно-безопасным подходом в java. Технически они правильные, но на практике это не имеет значения.
Это не должно быть очень распространенной потребностью, но иногда она действительна. Ninject, который легче, чем StructureMap, позволяет передавать параметры при извлечении переходных объектов из контекста. Spring.NET.
В большинстве случаев объекты, объявленные в контейнере IoC, не являются временными и принимают другие непереходные объекты через конструкторы/свойства/методы в качестве зависимостей.
Однако, если вы действительно не используете контейнер как factory, и если у вас достаточно контроля над объектами, которые вы хотите разрешить, вы можете использовать инъекцию свойств или методов, даже если это звучит менее естественно и более в некотором роде.
Да, другие фреймворки более многофункциональны - вам нужно использовать инфраструктуру ioc, которая позволяет инжектировать конструктор. Spring - это пример многоязычного контейнера ioc, который допускает инъекцию зависимостей конструктора.
Другие рамки IoC более функциональны.
т.е. проверьте ParameterResolution с Autofac
Вы также можете сделать это с помощью Windsor легко