C# 使代理/服务类更通用

C# 使代理/服务类更通用,c#,generics,C#,Generics,我有4个类,每次我想调用数据库时都要修改它们,这个过程变得很荒谬。我想知道是否有一个简单的方法来简化这个过程 我有一个呼叫类,以便: public ResponseObjectA getClients() { RequestObjectA req = new RequestObjectA(); ResponseObjectA res = ProxyClass.GetClients(request); } public ResponseObjectB getVendors()

我有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);
}
然后在我的服务课上:

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);
}
最后,我的同学们:

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

public void getVendors(RequestObjectB request, ResponseObjectB response) [
    ..perform sql stuff
}
如果我要添加ResponseObjectC和RequestObjectC,如果我要打一个名为GetSales的电话,你们有人看到这里的问题吗?这是另外5个更新

我简化了这些方法只是为了说明这一点,每种方法都做了一些有用的事情。我的问题是复制方法和更改一段代码的重复性。我想知道是否有一种方法可以为ProxyClass和ServiceClass创建泛型类型,这样我就不必修改它们了。只有调用类和DALClass

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

一个解决方案: 我想让所有的方法名都称为Handle,并使用方法重载

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

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

但是我不确定代理类和服务类在验证调用了正确的处理程序时会是什么样子。

您将遇到的主要问题是web服务不支持泛型-它们需要具体的类型。我不想让所有级别都通用,而是想看看哪里有可重用的代码,并尝试将其重构为公共类,在这些类中您可以进一步使用泛型


如果你不喜欢复制/粘贴,你可以考虑创建模板,为你自己生成大多数通用结构和代码;您只需填写新类型的详细信息。

您将遇到的主要问题是web服务不支持泛型-它们需要具体类型。我不想让所有级别都通用,而是想看看哪里有可重用的代码,并尝试将其重构为公共类,在这些类中您可以进一步使用泛型


如果你不喜欢复制/粘贴,你可以考虑创建模板,为你自己生成大多数通用结构和代码;d只需填写新类型的详细信息。

看来您可以编写一两个通用方法:

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

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

看起来您可以编写一两个通用方法:

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

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

看起来您发布的代理代码中存在复制/粘贴错误。第一个方法应该是getClients,不是吗?另外,为什么代理代码实例化响应对象只是为了将其丢弃?另外,为什么不是DAL创建了响应对象,而不是您的服务类创建了要填充的实例,就像现在看起来的那样?哈哈,您是对的。这就是为什么我讨厌复制和粘贴。。我在代码中一遍又一遍地犯同样的错误。这令人沮丧。这就是为什么我想消除这个过程。至于DAL没有创建响应对象。。不知道。这不是我的设计模式。。而那些成功的人从来没有花时间去想清楚。。所以我正在承受它的后果。考虑到目前的状态,我想要一个更简单的方法来纠正这个过程。看起来你发布的代理代码中有一个复制/粘贴错误。第一个方法应该是getClients,不是吗?另外,为什么代理代码实例化响应对象只是为了将其丢弃?另外,为什么不是DAL创建了响应对象,而不是您的服务类创建了要填充的实例,就像现在看起来的那样?哈哈,您是对的。这就是为什么我讨厌复制和粘贴。。我在代码中一遍又一遍地犯同样的错误。这令人沮丧。这就是为什么我想消除这个过程。至于DAL没有创建响应对象。。不知道。这
这不是我的设计模式。。而那些成功的人从来没有花时间去想清楚。。所以我正在承受它的后果。考虑到目前的状态,我希望有一种更简单的方法来纠正这个过程。遗憾的是,它们都没有使用通用代码。只是有些代码看起来很相似。我可能真的需要研究T4的模板,我正要修改一段代码注释。如果没有太多的通用代码,那么泛型肯定不会有多大帮助。泛型意味着重用代码,而不是方法签名。明白了。。我想用泛型,因为我希望这个过程是泛型的。。哈哈。谢谢你的建议。遗憾的是,他们都没有使用通用代码。只是有些代码看起来很相似。我可能真的需要研究T4的模板,我正要修改一段代码注释。如果没有太多的通用代码,那么泛型肯定不会有多大帮助。泛型意味着重用代码,而不是方法签名。明白了。。我想用泛型,因为我希望这个过程是泛型的。。哈哈。谢谢你的建议。