C# 我的类工厂能使用更少的代码吗?

C# 我的类工厂能使用更少的代码吗?,c#,.net,inversion-of-control,unity-container,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() {

我在代码中加入了这种模式,用于实例化业务对象:

// 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()
并让它每次都创建一个新的

这样行吗?我们将unity用于我们的服务和功能(即ViewModels、Helpers)类。但我们从未使用它来创建业务对象(如客户或订单)。

新答案

事实上,您将减少builerplate代码。域类与任何其他类没有区别。您可以注册从接口到具体类型的映射,并在需要时提供ctor参数,而不是使用工厂类。看

旧答案

通过任何容器解析对象总是比调用虚拟方法和构造函数慢。在原始性能中,您不会从DI容器中获益。

新答案

事实上,您将减少builerplate代码。域类与任何其他类没有区别。您可以注册从接口到具体类型的映射,并在需要时提供ctor参数,而不是使用工厂类。看

旧答案


通过任何容器解析对象总是比调用虚拟方法和构造函数慢。在原始性能中,您不会从DI容器中获得好处。

在我看来,这完全取决于构建给定对象(即WizBang)的实例有多复杂,以及它的更改频率


如果IWizBang的实现始终是WizBang,或者如果创建WizBang实例只需要调用默认构造函数,那么引入IOC容器就太过分了。。。您可以轻松地创建一个工厂方法来为您生成该方法。开发人员经常忘记,配置复杂性会给项目新手带来负担,甚至是不需要添加需要配置的新实体的开发人员。

在我看来,这一切都取决于构建给定对象(即WizBang)的实例有多复杂,以及它的更改频率


如果IWizBang的实现始终是WizBang,或者如果创建WizBang实例只需要调用默认构造函数,那么引入IOC容器就太过分了。。。您可以轻松地创建一个工厂方法来为您生成该方法。开发人员经常忘记,配置的复杂性会给项目新手带来负担,甚至是不需要经常添加需要配置的新实体的开发人员。

我会保留IOrderFactory。DI容器在为您提供服务方面非常出色,但是当您需要一个实体(特定对象标识非常重要的地方)时,使用容器往往会出现问题

我这样做有几个原因:

  • 创建实体往往需要该实体的数据(顺序) ID、行项目等),它们在每次创建时都是不同的 信息技术处理容器会变得困难和尴尬
  • 为了做到这一点,需要将容器实例提供给业务逻辑。你真的不希望你的代码直接依赖于容器,除了在合成根。根据我的经验,看到大量的
    IUnityContainer
    依赖项是一个警告信号
  • 但是,您可以利用容器—将IOrderFactory保持为依赖项,然后将工厂注入容器中。然后,您可以将创建订单所需的任何服务注入工厂本身,以保持不变。您还可以将容器注入工厂


    另一种选择是,如果您确实可以创建一个订单,并且在您配置的参数值之外没有特殊的参数值,那么可以插入一个Func-a工厂函数。这将在运行时由容器生成,并在调用时回调到container.Resolve中。如果您发现需要更多参数或控件,或许可以从那里开始构建IOrderFactory?

    我会保留IOrderFactory。DI容器在为您提供服务方面非常出色,但是当您需要一个实体(特定对象标识非常重要的地方)时,使用容器往往会出现问题

    我这样做有几个原因:

  • 创建实体往往需要该实体的数据(顺序) ID、行项目等),它们在每次创建时都是不同的 信息技术处理容器会变得困难和尴尬
  • 为了做到这一点,需要将容器实例提供给业务逻辑。你真的不希望你的代码直接依赖于容器,除了在合成根。根据我的经验,看到大量的
    IUnityContainer
    依赖项是一个警告信号
  • 但是,您可以利用容器—将IOrderFactory保持为依赖项,然后将工厂注入容器中。然后,您可以将创建订单所需的任何服务注入工厂本身,以保持不变。您还可以将容器注入工厂


    另一种选择是,如果您确实可以创建一个订单,并且在您配置的参数值之外没有特殊的参数值,那么可以插入一个Func-a工厂函数。这将在运行时由容器生成,并在调用时回调到container.Resolve中。如果您发现需要更多的参数或控制,也许可以从那里开始构建IOrderFactory?

    对不起,高效是指使用更少的代码。我已经改变了我的标题来反映这一点。对不起,所谓高效,我的意思是使用更少的代码。为了反映这一点,我改变了我的头衔。说得好。(注意:我将我的示例从WizBang更改为Order,以表明这是一个