能否在工厂中使用C#对象初始化程序

3

我正在研究C# 3.0中的新对象初始化程序,并希望使用它们。但是,我不知道如何将它们与Microsoft Unity等内容一起使用。也许我错过了什么,但如果我想保留强类型属性名称,那么我不确定能否实现。例如,我可以使用以下代码(伪代码):

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

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

然后通过反射在Create中执行某些操作来初始化参数...但如果我想在Create级别上强制使用类型,就像新对象初始化程序一样,我不知道该怎么做。

有更好的方法吗? 谢谢

6个回答

0
据我所知,这是不可能的。如果我是你,我会避免使用反射,因为反射非常缓慢,很容易成为应用程序的瓶颈。我认为在这种情况下使用反射实际上是滥用反射。
不要因为想模拟一些语法糖而自己给自己惹麻烦。只需按传统方式逐个设置实例的字段/属性即可。这比使用反射快得多。
记住:没有银弹式的设计模式。工厂方法和对象初始化器虽然好,但请理性使用,只有在真正有意义的时候才使用。

0

我对Unity不是很熟悉,但IoC / DI背后的思想是您不会自己构造对象,因此您当然不能使用对象初始化语法。

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

无论如何,如果您像Factory.Create()这样进行调用,则可能错误地使用了IoC。


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

0
IoC / DI的背后想法是,您的组件将其依赖关系声明为特定类型(通常是接口)的构造函数参数或公共属性。
容器然后构建依赖图并满足这些需求(就像成熟的IoC(如Castle Windsor)中的组件生命周期一样)。
基本上,您编写组件,声明依赖项,然后在IoC容器中注册合同和实现,并不再关心构造对象。你只需要做一个类似于Application.Start()的单个调用:)
不好的是,某些框架很难集成。例如ASP.NET WebForms,在那里您无法控制IHttpHandler的创建,并且无法设置使用IoC来实例化它们的工厂。您可以检查Ayende的“Rhino Igloo”,它尽最大努力在这种环境下使用IoC。

0

你也可以投票关闭吗? - Ruben Bartelink

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接