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 级别强类型化,就像新的对象 intitalisers 一样,那么我看不出我能做什么。

有没有更好的办法?谢谢

4

6 回答 6

0

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

于 2008-11-28T15:30:06.933 回答
0

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

有四种可能性:

  • 接受一个 lambda 作为参数
  • 而是返回一个构建器
  • 使用默认构造函数,传入一个初始化的对象
  • 使用匿名对象
于 2010-09-19T00:03:18.753 回答
0

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

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

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

于 2008-12-01T16:22:24.470 回答
0

也许这会有所帮助...您查看过这篇博文吗?

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

作者提出了一种从工厂构建对象并将对象注册到 IoC 容器中的方法。

于 2009-02-25T03:46:30.393 回答
0

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

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

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

于 2008-11-28T14:32:18.797 回答
0

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

我猜您可以在示例中使用 C# 3.0 中的匿名类型而不是 Dictionary。不知道 Unity 是否可以使用它。

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

于 2008-11-28T14:32:30.870 回答