服务定位器的变化

时间:2013-01-03 02:04:53

标签: c# generics service-locator

IModificationRequst<Employee> req = new ModificationRequst();
Locator.Instance.GetService<IModificationRequstHandler<Employee>>().Handle(req);

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

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

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

但是对于泛型有困难,是否已经建立了一种模式,用于将请求恢复到正确的请求处理程序并调用它们的处理,而不是获取处理程序然后从客户端调用它们的Handle方法?

2 个答案:

答案 0 :(得分: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中推断出来的,因此不需要指定。

答案 1 :(得分: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);

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