Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/url/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 3.0 是否可以在工厂中使用C#对象初始值设定项_C# 3.0_Factory - Fatal编程技术网

C# 3.0 是否可以在工厂中使用C#对象初始值设定项

C# 3.0 是否可以在工厂中使用C#对象初始值设定项,c#-3.0,factory,C# 3.0,Factory,我正在研究C#3.0中的新对象初始值设定项,并希望使用它们。但是,我不知道如何将它们与Microsoft Unity这样的东西一起使用。我可能遗漏了一些东西,但是如果我想保留强类型属性名,那么我不确定我是否可以。e、 g.我可以这样做(伪代码) Dictionary parms=newdictionary(); 添加(“Id”、“100”); i thing thing=Factory.Create(parms)(); 然后在Create via reflection中执行一些操作来初始化参数

我正在研究C#3.0中的新对象初始值设定项,并希望使用它们。但是,我不知道如何将它们与Microsoft Unity这样的东西一起使用。我可能遗漏了一些东西,但是如果我想保留强类型属性名,那么我不确定我是否可以。e、 g.我可以这样做(伪代码)

Dictionary parms=newdictionary();
添加(“Id”、“100”);
i thing thing=Factory.Create(parms)();
然后在Create via reflection中执行一些操作来初始化参数。。。但是,如果我想在创建级别使用强类型,比如新的对象初始化器,那么我不知道如何才能做到

有更好的办法吗?
谢谢你,这是不可能的。如果我是你,我会远离反射,因为反射非常慢,很容易成为应用程序的瓶颈。我认为使用反射实际上是滥用反射

不要因为你想模仿一些语法上的甜言蜜语而朝自己的腿开枪。只需按照经典方式逐个设置实例的字段/属性。它将比反射快得多


记住:没有设计模式是银弹。工厂方法和对象初始值设定项很好,但是尽量使用常识,并且只有在它们真正有意义时才使用它们。

我对Unity不太熟悉,但IoC/DI背后的思想是您不自己构造对象,所以当然不能使用对象初始值设定项语法

我猜在你的例子中,你可以从C#3.0中使用匿名类型而不是字典。不知道团结是否能消耗它


无论如何,如果你像Factory.Create()这样调用,你很可能是以错误的方式使用IoC。

考虑把时间花在学习Unity或Castle或任何其他可用于.net的IoC框架上。IOC将允许您将对象初始化的复杂性从代码转移到配置文件中。在应用程序中,您将使用接口访问IOC容器初始化的对象。IOC为您提供的另一项服务是控制对象的生存期(单例等)。

Graham,IOC/DI背后的思想是,您的组件将其依赖项声明为构造函数参数或特定类型(通常是接口)的公共属性。 然后,容器构建一个依赖关系图,并满足这些依赖关系图(如果是像Castle Windsor这样成熟的IoC,则与组件生活方式有关)

所以基本上,您编写组件、状态依赖项,然后在IoC容器中注册契约和实现,而不再关心构建对象。您只需执行一个类似于Application.Start()的调用:)


糟糕的是有些框架很难集成。与ASP.NET WebForms类似,在ASP.NET WebForms中,您无法控制IHttpHandler的创建,也无法设置将使用IoC实例化这些内容的工厂。你可以去看看Ayende的“Rhino冰屋”,在这样的环境中使用IoC是最好的选择。

也许这会有帮助。。。你看过这篇博文了吗


作者介绍了一种从工厂构建对象并在IoC容器中注册对象的方法。

这个问题回答得更好:

有四种可能性:

  • 接受lambda作为参数
  • 返回一个生成器
  • 使用默认构造函数,传入初始化的对象
  • 使用匿名对象

请您投票表决是否也关闭?
Dictionary<string,object> parms = new Dictionary<string,object>();
parms.Add("Id", "100");

IThing thing = Factory.Create<IThing>(parms)();