Как передать аргументы конструктору в IOC-фреймворке - PullRequest
12 голосов
/ 24 сентября 2008

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

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

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

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

Другие фреймворки более многофункциональны? Или я неправильно использую IOC-фреймворк?

Ответы [ 7 ]

9 голосов
/ 21 февраля 2009

В структуре карты вы можете достичь этого, используя метод С:

string objectToLogFor = "PolicyName";
ObjectFactory.With<string>(objectToLogFor).GetInstance<ILogging>();

См .: http://codebetter.com/blogs/jeremy.miller/archive/2008/09/25/using-structuremap-2-5-to-inject-your-entity-objects-into-services.aspx

5 голосов
/ 25 февраля 2009

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

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

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

с использованием StructureMap:

var foo = "foo";
var service = container.With(foo).GetInstance<TContract>();
4 голосов
/ 24 сентября 2008

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

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

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

3 голосов
/ 25 сентября 2008

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

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

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

0 голосов
/ 25 февраля 2009

Вы также можете легко сделать это с Виндзором

0 голосов
/ 30 сентября 2008

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

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

0 голосов
/ 24 сентября 2008

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

...