使用Microsoft Unity IOC,如何将现有对象传递给注入?

时间:2011-04-29 18:29:08

标签: unity-container

所以,如果我有:

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

那么有没有办法实现:

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

3 个答案:

答案 0 :(得分:2)

如果要通过属性和方法注入构建现有实例,可以使用以下命令:

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

一般情况下,我不建议使用Unity的这个功能。有时你需要它,但它通常是一个警告标志,可以通过调整设计一点来解决,以更自然地使用IoC作为模式(不是框架)。有关如何使用它的更多详细信息,SO社区可能会提供其他一些选项......

答案 1 :(得分:1)

由于依赖注入容器旨在提供已完成的对象,因此您需要使用工厂模式(在这些情况下非常常见)来实现所需的配置:

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

答案 2 :(得分:0)

检查“Can I pass constructor parameters to Unity's Resolve() method?”问题(同样在Stack Overflow上)。