当.NET 2.0问世时,我对用于当时推出的几项服务的提供商工厂模式印象深刻......并开始在任何地方使用它。
然后我遇到了真正的麻烦:
我正在调用它,但是通过一个静态的Manager.DoWork(),它正在调用它的实例的DoWork(),它通常最终成为ProviderBase类中的公共代码,它检查了args,做了一些工作,最后称为抽象的InternalDoWork(),它是在CustomProvider类中实现的......
换句话说......一种非常曲折的方式调用一个方法(3到4个方法,在任何地方进行参数检查,在Manager或ProviderBase中查找/捕获/记录的地方不清楚?-etc。
所以,我的问题是:是否有其他模式我可以看一下配置文件配置功能,允许动态更改 - 好吧,至少在重启时 - 服务提供商?
PS:我最近听说IoC / DOI是一个可能更快的解决方案......虽然没有在生产中使用它。它看起来很有趣......但我的第一印象是DOI似乎有交换服务,可在配置文件中配置,但不能从配置文件中设置参数?谢谢!
答案 0 :(得分:1)
如果您想探索依赖注入,我建议使用Ninject或StructureMap库。有很多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。