【问题标题】:Is it possible to use C# Object Initializers with Factories [duplicate]是否可以将 C# 对象初始化器与工厂一起使用 [重复]
【发布时间】:2010-09-24 11:04:49
【问题描述】:

我正在查看 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,那么我不知道该怎么做。

有没有更好的方法? 谢谢

【问题讨论】:

    标签: c#-3.0 factory


    【解决方案1】:

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

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

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

    【讨论】:

      【解决方案2】:

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

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

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

      【讨论】:

        【解决方案3】:

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

        【讨论】:

          【解决方案4】:

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

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

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

          【讨论】:

            【解决方案5】:

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

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

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

            【讨论】:

              【解决方案6】:

              这个问题的答案更好:Is it possible to use a c# object initializer with a factory method?

              有四种可能性:

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

              【讨论】:

              • 你也可以投票关闭吗?
              猜你喜欢
              • 2010-10-15
              • 2015-12-03
              • 1970-01-01
              • 2011-09-23
              • 2018-04-20
              • 1970-01-01
              • 1970-01-01
              • 2022-09-18
              • 2013-09-03
              相关资源
              最近更新 更多