【发布时间】:2017-01-13 08:10:06
【问题描述】:
假设我有一个使用 WCF 在 c# 中实例化对象的 REST 接口。假设此 REST 接口提供有关特定企业的客户的信息,例如:他们的姓名、年龄、居住县等。
REST 接口如下所示:
public interface IRestCustomerService
{
public string CustomerName(int customerId);
public int CustomerAge(int customerId);
public string CustomerCountry(int customerId);
public DateTime CustomerLastPurchaseInStore(int customerId, int storeId);
..
..
}
现在,假设我有一个班级:
public class Customer
{
private int customerId;
private IRestCustomerService restService;
public Customer(int ctrId, string serviceUrl)
{
customerId = ctrId;
restService = CreateConnection(serviceUrl);
}
}
我想要的是能够通过客户类调用接口IRestCustomerService定义的方法,而不必实例化customerId参数; Customer 类应使用其成员 customerId 作为此参数。
例如:
Customer c = new Customer(1, serverUl);
string name = c.CustomerName();
DateTime lastPurchase = c.CustomerLastPurchaseInStore(5);
..
如果rest服务接口定义了很多方法,对于接口定义的每个方法,自己在客户类上写封装函数真的很繁琐。有什么办法可以自动做到这一点?
在函数式编程中,这将是微不足道的,因为我想要的是接口的 curryfied 版本。但是,如果不明确定义每个包装方法或需要具体实现的接口的新定义,我就看不到在 c# 中执行此操作的方法。
【问题讨论】:
-
不确定它是否真的与您所追求的相匹配,但是您可以为 Customer 类创建扩展方法,而不是为 REST 服务创建接口吗?之前有人告诉我,在您的业务对象中引用服务是一个坏主意,这适用于您的示例。
-
不清楚你真正想要什么。如果
IRestCustomerService的所有实现者都有customerId,为什么接口需要这个值?如果他们不这样做,一般解决方案将如何工作?没有customerId的接口实现者会怎么做? -
您可以在
IRestCustomerService上声明一个扩展方法,该方法将通过反射检查实现类以使用适当的字段(缓存结果...使用dynamic可能有用) ,但在您的示例中,customerId是私有实现细节;对于该类之外的任何代码,甚至了解该领域,这将是一个主要的设计缺陷,更不用说使用它了。而且您仍然必须单独执行每种方法。 -
如果您从一个 F# 示例(即一种函数式语言)开始,并展示 该 语言将如何做您想做的事情,并解释您想要什么语法在 C# 中做同样的事情,你的问题会更清楚。