特定的通用接口

时间:2010-03-02 17:07:13

标签: c# generics interface repository-pattern

我正在重构各种类型的所有存储库接口。它们中的大多数都包含非常类似的方法,如Add,Update,但有些方法只对特定类型有意义。这是一个最佳实践问题。

我考虑过使用泛型来理顺事物。

 public interface IRepository<T>
 {
      T Get(int id);
      void Add(T x);
 }

但现在针对具体方法。我当然可以“继承”接口,但那时我并没有比以前更好。我的代码如下:

 IUserRepository<User> users;

如果我可以有多个约束,那么一个简洁的方法就是:

 public partial interface IRepository<T>
 {
      T Get(int id);
      void Add(T x);
 }

 public partial interface IRepository<T> where T: User
 {
      T Get(Guid id);
 }

 public partial interface IRepository<T> where T: Order
 {
      T Get(string hash);
 }

但编译器抱怨存在冲突的继承。另一种方式是对方法的限制:

 public partial interface IRepository<T>
 {
      T Get(int id);
      void Add(T x);

      T Get(Guid id) where T: User;
      T Get(string hash) where T: Order;
 }

但这不是这项工作的方式。当然,编译器不是我的意图,而是想要对方法进行类型定义。

现在我只有抛出NotImplemented的方法。难看。

我正在寻找能让我自己踢的解决方案。

2 个答案:

答案 0 :(得分:6)

public interface IRepository<TEntity, TId>
 {
      TEntity Get(TId id);
      void Add(T x);
 }

public class UserRepository : IRepository<User, Guid>
{
    public User Get( Guid id ) 
    {
        // ...
    }

    public void Add( User entity) 
    {
        // ...
    }
}

public class OrderRepository : IRepository<Order, string> 
{
    //...
}

答案 1 :(得分:2)

以下是我对类似问题的看法:

Advantage of creating a generic repository vs. specific repository for each object?

要点是,域名通常不能一概而论,另一种方法是有序的。我给出了一个使用特定于域的接口但使用通用基类的示例。