【问题标题】:Variation on Service Locator服务定位器的变化
【发布时间】:2012-12-17 09:57:56
【问题描述】:
IModificationRequst<Employee> req = new ModificationRequst();
Locator.Instance.GetService<IModificationRequstHandler<Employee>>().Handle(req);

我有一个服务定位器,它可以定位返回实现 IModificationRequstHandler 的对象实例的服务。

我试图将其修改为而不是返回一个 IModificationRequstHandler 实现者,它只是在内部找到服务并调用它的处理程序方法,所以上面的 2 行看起来像这样:

IModificationRequst<Employee> req = new ModificationRequst();
Locator.Instance.HandleRequest<IModificationRequst<Employee>>(req);

但是在使用泛型时遇到了困难,是否有一种已经建立的模式可以将请求重新分配给适当的请求处理程序并调用它们的处理,而不是获取一个处理程序然后从客户端调用它们的 Handle 方法?

【问题讨论】:

  • 出于兴趣,你为什么不将 IModificationRequst 的实现注入到类中,而不是在方法中使用定位器。
  • @RobertSlaney :没有特殊原因。这就是现在的情况,一旦遇到这个问题,可能会很好地重构它。
  • 如果你注入,这个问题就无效了!。你基本上是想实现命令模式

标签: c# generics service-locator


【解决方案1】:

定位器类中的HandleRequest 方法应定义如下(假设Handle 的返回类型为void):

public void HandleRequest<T>(IModificationRequest<T> req)
{
    IModificationRequstHandler<T> handler = GetService<IModificationRequest<T>>();
    handler.Handle(req);
}

你的IModificationRequstHandler接口应该定义如下:

public interface IModificationRequstHandler<T>
{
    void Handle(IModificationRequst<T> req);
}

然后您的电话将变为:

Locator.Instance.HandleRequest(req);

这里的泛型类型参数Employee是从参数值req推断出来的,因此不需要指定。

【讨论】:

  • 谢谢,但是“ // get handler不知何故...” 是怎么回事?尝试使用 Locator.Instance.GetSerice?>();
  • 我会编辑,虽然这有点猜测,因为我不知道你的 Locator.GetService() 方法需要能够做什么(它只得到IMethodRequestHandlers ?)。
  • +1 谢谢。我最终制作了一个使用服务定位器的另一个类。
【解决方案2】:

这违反了单一职责原则。你不应该让服务定位器为不同的服务实现逻辑。

如果你确实想使用静态类,你应该添加另一个:

public static class RequestHandler
{
    public static void Handle<T>(T request)
    {
        Locator.Instance.GetService<IModificationRequstHandler<T>>().Handle(req);
    }
}

然后:

IModificationRequst<Employee> req = new ModificationRequst();
RequestHandler.Handle(req);

(旁注:您可以查看Dependency Injection & IoC containers,因为它使代码更易于维护)

【讨论】:

  • 使用 DI 或 IOC,等效的问题是什么?我很高兴放弃服务定位器,但在这种情况下,替代品是什么?
  • @Arjang:创建一个将容器作为构造函数参数的类,并在该应用程序内部使用容器(并在容器中注册新类)。
猜你喜欢
  • 2021-05-30
  • 2013-02-03
  • 1970-01-01
  • 2013-01-20
  • 2011-02-09
  • 2014-03-22
  • 1970-01-01
  • 2018-10-27
  • 2010-11-28
相关资源
最近更新 更多