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容器在为您提供服务方面非常出色,但是当您需要一个实体(特定对象标识非常重要的地方)时,使用容器往往会出现问题 我这样做有几个原因:
IUnityContainer
依赖项是一个警告信号另一种选择是,如果您确实可以创建一个订单,并且在您配置的参数值之外没有特殊的参数值,那么可以插入一个Func-a工厂函数。这将在运行时由容器生成,并在调用时回调到container.Resolve中。如果您发现需要更多参数或控件,或许可以从那里开始构建IOrderFactory?我会保留IOrderFactory。DI容器在为您提供服务方面非常出色,但是当您需要一个实体(特定对象标识非常重要的地方)时,使用容器往往会出现问题 我这样做有几个原因:
IUnityContainer
依赖项是一个警告信号另一种选择是,如果您确实可以创建一个订单,并且在您配置的参数值之外没有特殊的参数值,那么可以插入一个Func-a工厂函数。这将在运行时由容器生成,并在调用时回调到container.Resolve中。如果您发现需要更多的参数或控制,也许可以从那里开始构建IOrderFactory?对不起,高效是指使用更少的代码。我已经改变了我的标题来反映这一点。对不起,所谓高效,我的意思是使用更少的代码。为了反映这一点,我改变了我的头衔。说得好。(注意:我将我的示例从WizBang更改为Order,以表明这是一个