【发布时间】:2011-10-08 21:50:50
【问题描述】:
我正在考虑以通用/标准化的方式向我的 WCF Restful web 服务添加一些基本的搜索和过滤功能。
这个想法是客户端将 POST 一个 SearchRequest 到任何容器资源,即 /users 或 /sessions - 然后服务器应该为搜索结果构建一个 uri 并重定向到它们(POST-Redirect-GET 模式)。
我认为我需要这样做(接受建议)的方式是每个可搜索资源都应该实现我定义的接口。然后,该资源可以与我将创建的通用实用程序一起使用,只需几行代码即可实现。
我想出的界面是:
public interface ISearchable
{
ChunkedList<object> GetAll(int chunkStart, int chunkEnd);
ChunkedList<object> SearchByValue(string searchValue, int chunkStart, int chunkEnd);
ChunkedList<object> SearchByValueWithFilters(string searchValue, List<string> filters, int chunkStart, int chunkEnd);
}
实现此接口的任何资源都可以进行优化搜索并限制结果集(分块列表具有对象集合和上一个/下一个块 uri)。
我遇到的问题是接口上有一个泛型 ChunkedList<object> 但实际实现想要返回 ChunkedList<User> 或 ChunkedList<Session> 等,这给了我一个无效的强制转换异常。
我知道我可以使用 list.convert 将每个项目手动转换为一个对象,但是每个实现都必须这样做会很痛苦。
是否有更合适的接口或 OO 模式可用于此?例如,我可以使用基类实现“更清洁”的东西并从中派生可搜索资源吗?
【问题讨论】:
-
我刚刚看到了这个stackoverflow.com/questions/7433279/… - 我想这就是我想要的,一个通用接口,但实现定义了类型。这在 c# 中可能吗?
-
ChunkedList<object>非常没用。尝试将其设为 ISearchable和 ChunkedList<T>以保持真正的通用性。 -
谢谢!我不知道我可以定义这样的通用接口:)如果您想将此作为答案发布,我会按照您的要求接受,否则我会标记 Yochai 的答案。
-
你可以继续接受Yochai的回答。他有一个很好的例子:)