Вопрос

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

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>();

Видеть: http://codebetter.com/blogs/jeremy.miller/archive/2008/09/25/using-structuremap-2-5-to-inject-your-entity-objects-into-services.aspx

Другие советы

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

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

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

используя Структурную карту:

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

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

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

Некоторые люди возмущаются по этому поводу и настаивают на том, что внедрение c'tor — единственный потокобезопасный подход в Java.Технически они верны, но на практике это не имеет значения.

Это не должна быть очень распространенная потребность, но иногда она вполне оправдана. Нинжект, который легче, чем StructureMap, позволяет передавать параметры при извлечении временных объектов из контекста. Спринг.НЕТ слишком.

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

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

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

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

Т.е.проверить ПараметрРазрешение с Autofac

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top