Создание объектов с использованием Unity Resolve с дополнительными параметрами

13
задан stiank81 3 October 2009 в 00:16
поделиться

4 ответа

Изменить: этот ответ, на мой взгляд, устарел, потому что он предполагает более старую версию Unity. Ответ NotDan лучше.


У вас есть несколько вариантов. Они, честно говоря, немного неубедительны, но они будут работать.

Вариант 1: Контейнер с ограниченным объемом

Если вы хотите использовать конструктор инъекции, вам нужно создать ограниченный контейнер и поместите свои данные в этот контейнер с заданной областью:

IUnityContainer subContainer = _container.CreateChildContainer();

//Don't do this... create a custom type other than string, like
// MyConstructorParams or something like that... this gets the point across.
subContainer.RegisterInstance<string>("John");
Person person = subContainer.Resolve<Person>();

Вариант 2: Метод инициализации

Однако обычно я делаю отдельный метод инициализации на моем целевые объекты для переменных экземпляра:

 открытый класс Person
{
 общедоступный человек (команды IApplicationCommands)
 {..}
 public void Initialize (имя строки) {..}

 ..
}

И тогда ваше использование становится следующим:

Person person = container.Resolve<Person>();
person.Initialize("John");

Ни то, ни другое не особенно приятно, но оно выполнит свою работу. Важно выбрать соглашение и придерживаться его, иначе вы немного заблудитесь.

Надеюсь, это поможет.

9
ответ дан 1 December 2019 в 20:11
поделиться

Я не могу придумать, как сделать это с помощью внедрения конструктора. Я думаю, вам нужно будет использовать инъекцию свойств для зависимостей (отмеченных атрибутом Dependency), а затем либо взять только строку в конструкторе, создать экземпляр самостоятельно, а затем использовать BuildUp , чтобы подключите зависимости или сделайте строку свойством, которое вы задаете вручную после разрешения.

0
ответ дан 1 December 2019 в 20:11
поделиться

Есть несколько вариантов, которые вы можете рассмотреть:

В случае, когда вам нужно создать новый объект, который имеет допустимые зависимости в дополнение к любым предоставляемым данным (например, имя клиента), инкапсулируйте это в фабрику, которая сама была внедрена в вызывающий объект:

Person person = _personFactory.CreatePerson("bubba");

Фабрика может быть введена с зависимостями сущности и предоставлена ​​конструктору, если требуется, или установлена ​​другими способами, если необязательно:

var person = new Person("bubba", _domainService);

Для зависимостей переходных переменных, таких как стратегия, используемая конкретным методом, используйте Double Dispatch:

public class Person
{
    public void DoSomethingWith(SomeStrategy strategy)
    {
        strategy.DoSomething(this);
    }
 }

4
ответ дан 1 December 2019 в 20:11
поделиться

Могу ли я передать параметры конструктора в метод Unity Resolve ()?

container.Resolve<IFoo>(new ParameterOverrides<Foo> { { "name", "bar" }, { "address", 42 } });"
18
ответ дан 1 December 2019 в 20:11
поделиться
Другие вопросы по тегам:

Похожие вопросы: