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方法?
答案 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,因为它可以使代码更易于维护)