我有可以返回多种格式数据的Web服务。例如json和xml。我正在针对此Web服务构建一个简单的C#API,我希望这些方法能够从json,raw json或raw xml返回完全序列化的对象。例如:

List<Order> GetOrders(int customerId)
string GetOrders(int customerId)
XMLDocument GetOrders(customerId)

Customer GetCustomer(int customerId)
string GetCustomer(int customerId)
XMLDocument GetCustomer(int customerId)

我有一个关于做一个流利的api的想法,您可以在其中调用SetFormat()方法,然后该方法将为上述方法返回一个通用接口(interface)。但是我一直停留在该接口(interface)的外观上,因为返回序列化对象的实现会返回不同类型的对象。

另一个更简单的解决方案是仅具有返回序列化对象的方法,然后添加如下所示的out参数:
List<Order> GetOrders(int customerId, out string data)

但这不是我认为很好的解决方案。

更新

我更喜欢Sjoerd建议的非通用解决方案,因为我使问题过于复杂了。这就是我最终要做的事情:
public class ServiceEntity {
    List<Order> GetOrders(int customerId)....
}
public class ServiceJson {
    string GetOrders(int customerId)....
}
public class ServiceXml {
    XmlDocument GetOrders(int customerId)....
}

然后是这样的流利的服务类:
public class Service : IService {
    ....
    public AsJson() { return new ServiceJson(); }
    public AsEntity() { return new ServiceEntity(); }
    public AsXml() { return new ServiceXml(); }
}

像这样使用:
string json = Service.New().AsJson().GetCategories(1);
List<Order> = Service.New().AsEntity().GetCategories(1);

感谢所有的答复!

最佳答案

尝试使用泛型是很好的选择,但泛型不是万灵丹!

在这种情况下,我想知道与非泛型相比将节省多少代码:

List<Order> GetOrdersAsList(int customerId)
string GetOrdersAsString(int customerId)
XMLDocument GetOrdersAsXml(customerId)

我打赌几乎没有!

而且,如果您决定采用非通用方法,则很可能最终会在内部以以下方式结束:
List<Order> GetOrders(int customerId)
string OrdersToString(List<Order> orders)
XMLDocument OrdersToXml(List<Order> orders)

然后,可以将后两种方法移到单独的类中,从而导致GetOrders()与格式分离。

在我看来,这比在这种情况下尝试使用泛型更好,更清洁!

更新:不要误会我的意思,我喜欢泛型,并且在许多情况下,它们使代码更具可读性。其他几个答案也很有趣,因为它们显示了达到此目的的技术。因此,我建议研究它们:它们在其他情况下可能很有用。但是在这种情况下为,到目前为止,每个提出的解决方案都有实际的缺陷。这就是为什么我在这种情况下建议使用非泛型的原因。

关于具有不同返回类型的C#通用接口(interface),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/7836695/

10-17 02:41