データベース(SQL Server 2008 Express)を作成し、VisualStudio2010のORDesignerを使用してLINQtoSQLエンティティ(LinqEntitiesDataContextと呼ばれる)を作成しました。次に、リポジトリクラスと関連するIRepositoryインターフェイスを作成しました。データエンティティへの有意義なアクセスを提供する、素晴らしくシンプルなCRUDメソッドの例。たとえば、次の方法があります。
IQueryable<User> QueryUsersByType(UserTypeEnum userType)
そして別の:
void CreateUserWithDefaultType(User user)
ここで、このリポジトリを「ネットワークを介して」利用できるようにし、WCFデータサービス(OData)を使用してアクセスを提供したいと思います。しかし、私が見たODataのすべての例は、エンティティ自体(Usersエンティティなど)への直接アクセスを提供することになります。これは、データコンテキストクラスにIUpdatableを実装させ、このデータコンテキストクラスを参照するWCFデータサービスを作成することによって行われます。私の場合、それはLinqEntitiesDataContext IUpdatableを作成し、それをサービスタイプとして使用することを意味します。これにより、リポジトリクラスの使用が完全に回避されます。
データサービスにリポジトリを公開させる必要があると感じました。
DataService<Repository> // *Not* DataService<LinqEntitiesDataContext>
ただし、既存の更新メソッド(CreateUserWithDefaultTypeなど)の呼び出しを避けて、リポジトリにIUpdatableを実装させる必要があります。
ここで何が欠けていますか?エンティティレイヤーではなくリポジトリレイヤーを公開して、これを正しく行う方法の良い例はありますか?