Используя Microsoft Unity IOC, как вы можете передать существующий объект для инъекции? - PullRequest
0 голосов
/ 29 апреля 2011

Итак, если у меня есть:

public class CustomerViewModel
{
    public CustomerViewModel(ICustomer customer)
    {
        this.customer = customer
    }
}

, есть ли способ достичь:

ICustomerViewModel customerViewModel = container.Resolve<ICustomerViewModel>(existingCustomer);

Ответы [ 3 ]

2 голосов
/ 30 апреля 2011

Если вы хотите создать существующий экземпляр с помощью внедрения свойств и методов, вы можете использовать следующее:

var model = new CustomerViewModel(customer);
model = container.BuildUp(model);

В общем, я бы не рекомендовал использовать эту функцию Unity.Иногда вам это нужно, но обычно это предупреждающий знак, который можно исправить, немного подкорректировав дизайн, чтобы он более естественно работал с IoC как шаблоном (не каркасом).Более подробно о том, как вы его используете, сообщество SO, вероятно, может предложить некоторые другие варианты ...

1 голос
/ 29 апреля 2011

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

public interface ICustomerViewModelFactory {
   public ICustomerViewModel GetModelFor(ICustomer customer);
}

public class CustomerViewModelFactory : ICustomerViewModelFactory {
   public ICustomerViewModel GetModelFor(ICustomer customer) {
      return new CustomerViewModel(customer);
   }
}

// elsewhere...
container.RegisterInstance<ICustomerViewModelFactory>(new CustomerViewModelFactory());

// and finally...
ICustomerViewModelFactory factory = container.Resolve<ICustomerViewModelFactory>();
ICustomerViewModel customerViewModel = factory.GetModelFor(existingCustomer);
0 голосов
/ 30 апреля 2011

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

...