所以,如果我有:
public class CustomerViewModel
{
public CustomerViewModel(ICustomer customer)
{
this.customer = customer
}
}
那么有没有办法实现:
ICustomerViewModel customerViewModel = container.Resolve<ICustomerViewModel>(existingCustomer);
答案 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上)。