我正在查看C#3.0中的新对象初始值设定项,并希望使用它们。但是,我无法看到如何将它们与Microsoft Unity这样的东西一起使用。我可能错过了一些东西,但如果我想保留强类型的属性名称,那么我不确定我能不能。例如我可以这样做(伪代码)
Dictionary<string,object> parms = new Dictionary<string,object>();
parms.Add("Id", "100");
IThing thing = Factory.Create<IThing>(parms)();
然后在通过反射创建中做一些事情来初始化参数...但是如果我想要它在创建级别强烈输入,就像新对象intitalisers那么我不知道我怎么做。
有更好的方法吗? 感谢
答案 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)
所以基本上你编写你的组件,状态依赖,然后在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?。
有四种可能性: