服务定位器模式和DDD

时间:2012-02-20 12:31:27

标签: c# .net design-patterns domain-driven-design service-locator

我有一个带有DDD数据层的框架,它使用服务定位器模式。但是,目前我使用全局静态ServiceLocator类来存储所有引用。我想将它重构为一个正确的实现,其中类实现IServiceProvider接口,并删除全局静态ServiceLocator类。

现在,除了实体类之外,几乎在任何地方都不能使用IServiceProvider接口扩展现有类。问题是我认为实体类必须实现IServiceProvider非常奇怪,但我确实需要一种方法来访问服务提供者以便能够通过我的IoC容器解析存储库。

在不必在我的实体上实施IServiceProvider的情况下实施服务定位器模式的最佳方法是什么?

3 个答案:

答案 0 :(得分:3)

为什么实体(业务对象)会暴露IServiceProvider?它是业务对象,而不是服务。 IServiceProvider甚至不用于服务,它是一种公开服务提供者的IOC机制。

如果有的话,您的ORM /业务对象框架/运行时是服务提供者,而不是单个实体。

让我回答一下这个问题:我没有看到任何合理的编程概念,其中实体公开了IServiceProvider。

---更新

服务只应提供服务定位器 - 您应该有一个服务定位器。您可以将线程静态变量用于已定义线程访问元素的情况(例如,名称:UI,UI元素必须通过UI线程访问UI元素),这会破坏全局单例。

答案 1 :(得分:3)

服务定位器最好与控制反转容器(如Unity,Castle Windsor或NInject)结合使用。有关与Unity配合使用的服务定位器的示例,请参阅http://commonservicelocator.codeplex.com/wikipage?title=Unity%20Adapter&referringTitle=Home&ProjectName=commonservicelocator

请记住,Service Locator可以看作是反模式 - 应该非常小心地使用它。相反,使用构造函数或属性注入要好得多。但是在依赖关系非常依赖于正在执行的功能的情况下,Service Locator有一个地方。

答案 2 :(得分:0)

您在评论中指的是Service Locator模式。相应地修改您的问题。

今天的大多数应用程序使用依赖注入原则(SOLID原则中的D)而不是服务定位器模式。开始使用DIP的最简单方法是使用像Autofac这样的控制容器的反转。

Service Locator的想法是你有一个用于查找服务的类。要实现这一点,您需要使用某种注册机制来注册所有服务。

典型的启动:

serviceLocator.Add(new MyService());

以后用法

serviceLocator.Get<MyService>();

我建议您使用DIP,因为它使类更清楚地依赖于类。