我的班级工厂可以用Unity减少代码吗?

时间:2012-11-09 16:59:32

标签: c# .net inversion-of-control unity-container

我已将这种模式放在我的代码中以实例化业务对象:

// 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。但我们从未使用它来创建业务对象(如客户或订单。)

3 个答案:

答案 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容器在为您提供服务方面非常棒,但是当您需要实体(特定对象标识很重要的东西)时,使用容器通常会出现问题。

我会这样做有几个原因:

  1. 创建实体往往需要该实体的数据(订单 ID,订单项等),每次创建时都不同 它。使容器变得困难和笨拙。
  2. 为此,您需要将容器实例提供给业务逻辑。你真的不希望你的代码直接依赖于容器,除了在组合根。根据我的经验,看到许多IUnityContainer依赖项是一个警示标志。
  3. 但是,您可以利用容器 - 将IOrderFactory保留为依赖项,然后将工厂注入容器。然后,您可以将创建订单所需的任何服务注入工厂本身以保留。您也可以将容器注入工厂。

    另一种选择,如果真的是你可以创建一个没有超出你配置的特殊参数值的订单,那就是注入一个Func - 一个工厂函数。这将由容器在运行时生成,并在调用时调用回容器.Resolve。如果您发现需要更多参数或控制,也许你可以从那里开始构建IOrderFactory吗?