服务定位器的变体

本文关键字:定位器 服务 | 更新日期: 2023-09-27 17:50:41

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方法?

服务定位器的变体

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

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

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);

(旁注:您可以查找依赖注入&IoC容器,因为它使代码更易于维护)

您的定位器类中的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推断出来的,因此不需要指定。