是否可以将C#对象初始化器与工厂一起使用

时间:2008-11-28 14:19:45

标签: c#-3.0 factory

我正在查看C#3.0中的新对象初始值设定项,并希望使用它们。但是,我无法看到如何将它们与Microsoft Unity这样的东西一起使用。我可能错过了一些东西,但如果我想保留强类型的属性名称,那么我不确定我能不能。例如我可以这样做(伪代码)

Dictionary<string,object> parms = new Dictionary<string,object>();
parms.Add("Id", "100");

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

然后在通过反射创建中做一些事情来初始化参数...但是如果我想要它在创建级别强烈输入,就像新对象intitalisers那么我不知道我怎么做。

有更好的方法吗? 感谢

6 个答案:

答案 0 :(得分:0)

AFAIK,这是不可能的。如果我是你,我会远离反射,因为反射非常慢,很容易成为你应用程序的瓶颈。我认为使用反射实际上是在滥用反思。

不要在腿上射击,因为你想要模仿一些语法糖。只需逐个设置实例的字段/属性即经典方式。它会比反射快得多。

记住:没有设计模式是银弹。工厂方法和对象初始化器很不错,但尝试使用常识,只有在实际有意义时才使用它们。

答案 1 :(得分:0)

我对Unity并不熟悉,但IoC / DI背后的想法是你自己不构造对象,所以你当然不能使用对象初始化器语法。

我想你在C#3.0中可以使用的是一个匿名类型而不是Dictionary。不知道Unity是否能消耗它。

无论如何,如果你像Factory.Create()那样进行调用,你可能会以错误的方式使用IoC。

答案 2 :(得分:0)

考虑将时间花在Unity或Castle或任何其他可用于.net的IOC框架上。 IOC将允许您将对象初始化的复杂性从代码传输到配置文件。在您的应用程序中,您将使用接口来访问IOC容器初始化的对象。国际奥委会给你的另一项服务是控制对象的生命周期(单身等)。

答案 3 :(得分:0)

Graham,IoC / DI背后的想法是你的组件将它们的依赖声明为构造函数参数或特定类型的公共属性(通常是接口)。 然后容器构建一个依赖图并满足那些(关于组件生活方式,如果成熟IoC的情况如Castle Windsor)。

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

糟糕的是,某些框架很难与之集成。与ASP.NET WebForms一样,您无法控制IHttpHandler的创建,也无法设置使用IoC实例化的工厂。您可以查看Ayende的“Rhino Igloo”,它最好在这样的环境中使用IoC。

答案 4 :(得分:0)

也许这会有所帮助......你有没看过这篇博文?

http://www.cookcomputing.com/blog/archives/000578.html

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

答案 5 :(得分:0)

在这个问题中回答得更好:Is it possible to use a c# object initializer with a factory method?

有四种可能性:

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