使代理/服务类更通用

时间:2014-11-06 20:13:50

标签: c# generics

每次我想要调用数据库时,我都需要修改4个类,这个过程变得荒谬可笑。我想知道是否有一种简单的方法来简化流程。

我有一个调用类,以便:

public ResponseObjectA getClients() {
     RequestObjectA req = new RequestObjectA();
     ResponseObjectA res = ProxyClass.GetClients(request);
}

public ResponseObjectB getVendors() {
     RequestObjectB req = new RequestObjectB();
     ResponseObjectB res = ProxyClass.GetVendors(request);
}

然后在我的ProxyClass中:

public static ResponseObjectA getClients(RequestObjectA request) [
    ResponseObjectA res = new ResponseObjectA();
    res = ServiceClass.GetClients(request);
}

public static ResponseObjectB getVendors(RequestObjectB request) [
    ResponseObjectB res = new ResponseObjectB();
    res = ServiceClass.GetVendors(request);
}

然后在我的ServiceClass中:

public ResponseObjectA getClients(RequestObjectA request) [
    ResponseObjectA res = new ResponseObjectA();
    DALClass.GetClients(request, res);
}

public ResponseObjectB getVendors(RequestObjectB request) [
    ResponseObjectB res = new ResponseObjectB();
    DALClass.GetVendors(request, res);
}

最后是我的DALClass:

public void getClients(RequestObjectA request, ResponseObjectA response) [
   ..perform sql stuff..
}

public void getVendors(RequestObjectB request, ResponseObjectB response) [
    ..perform sql stuff
}

如果我要进行名为GetSales的调用,如果我要添加ResponseObjectC和RequestObjectC,那么你们有没有看到这里的问题?这是另外5个更新。

我简化了这些方法只是为了说明这一点,每个方法确实做了一些有用的事情。我遇到的问题是复制方法和更改一段代码的重复性。我想知道是否有办法为ProxyClass和ServiceClass做一个泛型类型,所以我不必修改它们。只是调用类和DALClass。

旁注: ResponseObjectA和ResponseObjectB都是BaseResponse的子类。同样对于RequestObjectA和RequestObjectB都是BaseRequest的子类。

一个解决方案: 我想到的是所有方法名称都叫做“Handle”并使用方法重载。

与DALClass的最终结果一样,将具有以下签名:

 public void Handler(RequestObjectA, ResponseObjectA) { }
 public void Handler(RequestObjectB, ResponseObjectB) { } 

但是我不确定Proxy和Service类是什么样子来验证正在调用正确的处理程序。

2 个答案:

答案 0 :(得分:3)

看起来你可以在某种程度上合并一两种通用方法:

public static TResponse get<TRequest, TResponse>(TRequest request, Func<TRequest, TResponse> getter) 
    where TRequest : BaseRequest
    where TResponse : BaseResponse
{
    TResponse res = getter(request);
}

你仍然需要写出每个方法,但它们会更短,因为你可以抽象出常见的东西:

public static ResponseObjectA getClients(RequestObjectA request) {
    return get(request, ServiceClass.GetClients);
}

public static ResponseObjectB getVendors(RequestObjectB request) {
    return get(request, ServiceClass.GetVendors);
}

另外,如果你还没有,我会看看T4 templates是否有用 - 看起来可能是这样。您可以维护类似于元组列表(方法名称,请求类型,响应类型)的内容,而不是对代理和服务类进行机器人编码,然后编写一个T4模板,使用每个条目的各种方法生成每个类在列表中。 (这就是在Visual Studio中生成自动生成的代码,如服务代理和数据库实体类。)

答案 1 :(得分:1)

您将遇到的主要问题是Web服务不支持泛型 - 它们需要具体类型。我不是试图让所有级别都是通用的,而是查看你有可重复使用的代码的位置,并尝试将其重构为公共类(你可以 可以使用泛型进一步)。

如果您不喜欢复制/粘贴,您可以考虑创建模板,这将为您生成大部分常见结构和代码 - 您只需填写详细信息即可新类型。