【问题标题】:Is there a less verbose solution than using the Provider Factory pattern?有没有比使用提供者工厂模式更简洁的解决方案?
【发布时间】:2009-08-15 10:19:13
【问题描述】:

当 .NET 2.0 出现时,我对当时推出的几个服务所使用的 Provider Factory 模式印象深刻......并开始在任何地方使用它。

但后来我遇到了真正的麻烦:

  • 在 CE 上,没有配置系统,因此无法轻松将其移植到该环境(因此会导致代码中出现严重的分叉,否则本可以在两个框架上很好地工作,只需进行几次修改)李>
  • 对于如何确保静态管理器都包装了提供程序的所有方法,我从来没有找到一个好的答案:providerBase 可以实现接口,但接口 (AFAIK) 不能用于静态方法。因此,封装的提供者和静态管理器之间总是存在分歧的机会。
  • 样板代码的数量激增,我的工作效率反而下降了。我的意思是,不仅仅是调用 instance.Method();

我正在调用它,但通过一个静态 Manager.DoWork(),它正在调用其实例的 DoWork(),它通常最终成为 ProviderBase 类中的公共代码,它检查 args,做了一些工作,最后调用了一个抽象的 InternalDoWork(),在 CustomProvider 类中实现了...

换句话说...调用方法的一种非常曲折的方式(3 到 4 个方法,到处检查参数,在哪里尝试/捕获/登录 - 在 Manager 或 ProviderBase 中不清楚?-等等。

所以,我的问题是:我可以查看另一种模式来提供配置文件配置功能,从而允许动态更改服务提供者 - 好吧,至少在重新启动时?

PS:我最近听说了很多关于 IoC/DOI 可能更快的解决方案......虽然没有在生产中使用它。看起来很有趣……但我的第一印象是DOI似乎有服务的交换,在配置文件中可配置,但不是配置文件中的参数设置?

谢谢!

【问题讨论】:

  • 感谢您使用真实世界的示例指出为什么 [在此处插入最喜欢的设计模式] 并不总是灵丹妙药。

标签: c# design-patterns


【解决方案1】:

如果你想探索依赖注入,我推荐NinjectStructureMap 库。 StackOverflow 有不少问题about .NET IoC containers though,所以只要搜索一下,你会发现更多信息。

至于您的实际问题,趋势似乎是使用 Composition-based 模型,而不是 Provider 模型使用的 Subtyping 模型。这似乎更接近于来自 Redmond 的新内容,例如 ASP.NET MVC

专注于组合意味着设计概述了部件之间的“具有”关系,而不是“是”关系。他们倾向于专注于定义更少的合同细节并让具体的实现处理如何履行合同,而不是强制构建路线(使用抽象方法),这在基于子类型的设计中很常见,并且经常过度设计解决方案以实现具体实施。这两种方法都有缺点(例如,版本控制通常被认为是使用接口的基于组合的设计的挑战),因此它可能取决于您在做什么。

总的来说,我认为依赖注入更适合应用程序代码,因为与定义严格的继承模型相比,组合应用程序通常会使它的耦合度降低,并且通常会使代码更容易进行单元测试。此外,通常在组合中引用的许多问题对于应用程序代码而言不如对框架重要(同样,版本控制)。事实可能在中间的某个地方,如在 MVC 中所见,组件之间的依赖关系使用简单的接口(组合),但实现通用功能的基类也可用于继承和仅覆盖必要的位。

这就是为什么 IoC 容器往往会在这里提供帮助,因为它们为系统提供了松散耦合的方式来请求组件,而无需了解任何有关实现的信息。例如,DependencyResolver.GetInstanceOf<IUserRepository>()

【讨论】:

    【解决方案2】:

    我想你会想看看像@David 的 Unity 建议这样的依赖注入库。我更喜欢Autofac。但还有其他人http://en.wikipedia.org/wiki/Dependency_injection

    【讨论】:

      【解决方案3】:

      来自 Microsoft 模式和实践组的 Unity 应用程序块非常好。虽然可能不是唯一或最好的。此外,在 Microsoft 使用 MEF 框架/将其集成到 Visual Studio 2010 中时,MEF 框架也得到了大量讨论。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-08-24
        • 2013-10-22
        • 1970-01-01
        • 2010-09-28
        • 1970-01-01
        • 1970-01-01
        • 2011-06-26
        • 1970-01-01
        相关资源
        最近更新 更多