【发布时间】:2009-10-23 10:53:16
【问题描述】:
我最近第一次开始使用IoC 容器,但我没有受过有关使用它的最佳实践的教育。更具体地说,我在 C# .NET 项目中使用Unity,我开始使用它是因为它附带了Prism。
我使用容器来解析“顶级”对象,它们会根据容器获得正确的对象注入。但是,当我有一个带有孩子和孩子的孩子的对象时,我无法清楚地看到最佳实践,并且我需要来自 IoC 容器的一些数据,但不是介于两者之间。您通常如何组织 IoC 容器的使用?
最初,我认为您应该将容器传递到需要它的任何地方,而不是从顶层容器中提取所需的数据并传递这些数据。但是,当我到达除了注入接口之外还获取其他特定数据的对象时,我又遇到了问题,我不希望在解析对象后通过属性或初始化方法注入这些。
我希望这已经足够清楚了,但是让我们看一个虚构的(而且有点愚蠢..)的例子。
class Employee
{
private ICommands _commands;
priate List<Customer> _customers = new List<Customer>();
public Employee(ICommands commands)
{
_commands = commands;
}
public void AddCustomer(string customerName)
{
var customer = new Customer(customerName, _commands);
_customers.Add(customer);
}
}
class Customer
{
private string _name;
private ICommands _commands;
priate List<Case> _cases = new List<Case>();
public Customer(string, name, ICommands commands)
{
_name = name;
_commands = commands;
}
public void AddCase()
{
var case = new Case(_commands);
_cases.Add(case);
}
}
class Case {
private ICommands _commands;
public Customer(ICommands commands)
{
_commands = commands;
}
public void TriggerCommands()
{
_command.TriggerSomething();
}
}
所以,这个例子并没有多大意义,但本质和我需要做的一样。我通过 ViewModel 类传递了一些应用程序命令,因为其中一些需要能够触发命令以显示某些内容。我也有公共存储等,某些类可能需要,但目前通过并存储在中间类中。仅使用命令,如果您存储命令或容器并没有什么大不了的,但是在典型的 IoC 用法中,是否会改为传递 IoC 容器,并使用它来解析对象?那么客户姓名等特定数据呢?你不能只在 Resolve() 上传递它,所以你需要在之后注入它?
抱歉 - 这是我能做到的最简短的。不需要相同长度的答案;-) .. 只是;用 IoC 容器做这样的事情的最佳实践是什么?
【问题讨论】:
标签: c# .net unity-container ioc-container