我已将这种模式放在我的代码中以实例化业务对象:
// UI or Business level code
public class SomeClass
{
IOrderFactory orderFactory;
public SomeClass(IOrderFactory orderFactory)
{
this.orderFactory = orderFactory
}
public void SomeMethod()
{
var newOrder = orderFactory.CreateOrder();
// Do stuff with new object
}
}
// In an interfaces only project
public interface IOrderFactory
{
Order CreateOrder();
}
// In an implementation project (not seen by most other modules)
public class OrderFactory
{
public Order CreateOrder()
{
return new Order();
}
}
我们目前使用Unity创建IOrderFactory
对象,但我想知道是否可以使用Unity(IOC)来生成Order
对象本身。
像unityContainer.Resolve<IOrder>()
之类的东西,每次都要制作一个新的?
那会有用吗?我们对服务和功能(即ViewModels,Helpers)类使用unity。但我们从未使用它来创建业务对象(如客户或订单。)
答案 0 :(得分:3)
在我看来,这一切都取决于构建给定对象(即WizBang)实例的复杂程度,以及它改变的频率。
如果IWizBang的实现永远是WizBang,或者如果创建一个WizBang实例只涉及调用默认构造函数,那么引入IOC容器就太过分了......你可以轻松地创建一个工厂方法来为你生成方法。开发人员经常忘记,配置复杂性可能会给项目新手,或者甚至不需要添加需要配置的新实体的开发人员造成负担。
答案 1 :(得分:1)
新答案
确实,你会减少builerplate代码。域类与任何其他类没有区别。您可以注册从接口到具体类型的映射,而不是拥有工厂类,并在需要时提供ctor参数。见http://msdn.microsoft.com/en-us/library/ff648211.aspx
旧答案
通过任何容器解析对象总是比调用虚方法和调用构造函数慢。它不是原始性能,你可以从DI容器中获益。
答案 2 :(得分:1)
我会保留IOrderFactory。 DI容器在为您提供服务方面非常棒,但是当您需要实体(特定对象标识很重要的东西)时,使用容器通常会出现问题。
我会这样做有几个原因:
IUnityContainer
依赖项是一个警示标志。但是,您可以利用容器 - 将IOrderFactory保留为依赖项,然后将工厂注入容器。然后,您可以将创建订单所需的任何服务注入工厂本身以保留。您也可以将容器注入工厂。
另一种选择,如果真的是你可以创建一个没有超出你配置的特殊参数值的订单,那就是注入一个Func - 一个工厂函数。这将由容器在运行时生成,并在调用时调用回容器.Resolve。如果您发现需要更多参数或控制,也许你可以从那里开始构建IOrderFactory吗?