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

4

2 回答 2

1

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

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

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 容器,因为它使代码更易于维护

于 2013-01-03T06:30:18.323 回答
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,因此不需要指定。

于 2013-01-03T04:47:37.547 回答