每次我想要调用数据库时,我都需要修改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类是什么样子来验证正在调用正确的处理程序。
答案 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服务不支持泛型 - 它们需要具体类型。我不是试图让所有级别都是通用的,而是查看你有可重复使用的代码的位置,并尝试将其重构为公共类(你可以 可以使用泛型进一步)。
如果您不喜欢复制/粘贴,您可以考虑创建模板,这将为您生成大部分常见结构和代码 - 您只需填写详细信息即可新类型。