我创建了一个数据库(SQL Server 2008 Express),并使用 Visual Studio 2010 中的 OR 设计器在顶部创建了一些 LINQ to SQL 实体(称为 LinqEntitiesDataContext)。然后我创建了一个 Repository 类和关联的 IRepository 接口,其中包含一堆提供对数据实体的有意义访问的漂亮而简单的 CRUD 方法。例如,有一个方法:
IQueryable<User> QueryUsersByType(UserTypeEnum userType)
另一个:
void CreateUserWithDefaultType(User user)
现在我想让这个存储库“通过网络”可用,并希望使用 WCF 数据服务 (OData) 来提供访问。但是我看到的每个 OData 示例最终都提供了对实体本身(例如用户实体)的直接访问,他们通过使数据上下文类实现 IUpdatable 并创建一个引用此数据上下文类的 WCF 数据服务来做到这一点。就我而言,这意味着使 LinqEntitiesDataContext IUpdatable 并将其用作服务类型——这完全避免了使用我的 Repository 类。
我觉得我需要让数据服务公开我的存储库:
DataService<Repository> // *Not* DataService<LinqEntitiesDataContext>
但是我需要让我的存储库实现 IUpdatable,避免调用我现有的更新方法(例如 CreateUserWithDefaultType)
我在这里想念什么?有没有一个很好的例子来说明如何正确地做到这一点,暴露存储库层而不是实体层?