我最近开始使用IoC第一次使用容器,但我没有接受过使用它的最佳实践的教育。更具体地说我正在使用Unity在一个 C# .NET 项目中,我开始使用它,因为它附带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 容器执行此类操作的最佳实践是什么?
我不太确定我是否理解你的问题。但我认为你根本不应该传递容器。为容器创建一个包装类要容易得多。例如:
public class IoCContainer
{
private static ContainerType = null;
public static ContainerType Instance
{
get
{
if (_container == null)
{
string configFileName = ConfigurationManager.AppSettings[ConfigFileAppSettingName];
_container = new WindsorContainer(new XmlInterpreter(configFileName));
}
return _container;
}
}
}
现在您可以在代码中的任何地方调用它。
IoCContainer.Instance.Resolve<IAwesomeService>();
这对你有帮助吗?
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)