特定的通用接口

Mar*_*tin 3 c# generics interface repository-pattern

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

我想过使用泛型来理顺事物.

 public interface IRepository<T>
 {
      T Get(int id);
      void Add(T x);
 }
Run Code Online (Sandbox Code Playgroud)

但现在针对具体方法.我当然可以"继承"接口,但那时我并没有比以前更好.我会有像这样的代码:

 IUserRepository<User> users;
Run Code Online (Sandbox Code Playgroud)

一个巧妙的方法是,如果我可以有多个约束,如:

 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);
 }
Run Code Online (Sandbox Code Playgroud)

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

 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;
 }
Run Code Online (Sandbox Code Playgroud)

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

现在我只有抛出NotImplemented的方法.丑陋.

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

µBi*_*Bio 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> 
{
    //...
}
Run Code Online (Sandbox Code Playgroud)