是否有比使用Provider Factory模式更简洁的解决方案?

时间:2009-07-23 22:01:13

标签: c# design-patterns

当.NET 2.0问世时,我对用于当时推出的几项服务的提供商工厂模式印象深刻......并开始在任何地方使用它。

然后我遇到了真正的麻烦:

  • 在CE上,没有配置系统,因此无法轻松移植到该环境中(因此导致代码中的严重分叉可能会在两个框架上很好地工作,只需要几次修改)
  • 我从来没有找到一个很好的答案,如何确保静态管理器已经包装了提供者的所有方法:providerBase可以实现一个接口,但接口(AFAIK)不能用于静态方法。因此,包装的提供程序和静态管理器之间总是存在分歧。
  • 通过屋顶拍摄的锅炉板代码数量,我的生产力在地板上反复下降。我的意思是,而不是只调用instance.Method();

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

换句话说......一种非常曲折的方式调用一个方法(3到4个方法,在任何地方进行参数检查,在Manager或ProviderBase中查找/捕获/记录的地方不清楚?-etc。

所以,我的问题是:是否有其他模式我可以看一下配置文件配置功能,允许动态更改 - 好吧,至少在重启时 - 服务提供商?

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

谢谢!

3 个答案:

答案 0 :(得分:1)

如果您想探索依赖注入,我建议使用NinjectStructureMap库。有很多StackOverflow问题about .NET IoC containers though,所以只需搜索,您就会找到更多信息。

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

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

一般来说,我认为依赖注入对于应用程序代码来说更好,因为组合应用程序通常会使它比定义严格的继承模型更紧密耦合,并且通常使代码更容易进行单元测试。此外,组合中通常引用的许多问题对于应用程序代码而言不如框架(再次,版本控制)那么重要。事实可能在中间,如MVC所示,组件之间的依赖关系使用简单的接口(组合),但实现常用功能的基类也可用于继承和覆盖必要的位。

这就是为什么IoC容器倾向于在这里提供帮助的原因,因为它们为系统提供松散耦合的手段,以便在不必了解任何实现的情况下询问组件。例如,DependencyResolver.GetInstanceOf<IUserRepository>()

答案 1 :(得分:0)

Microsoft的模式和实践组中的Unity应用程序块非常好。虽然可能不是那里唯一或最好的一个。此外,MEF框架在Microsoft土地上进行了大量讨论,因为他们正在使用/集成到Visual Studio 2010中。

答案 2 :(得分:0)

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