我正在重构各种类型的所有存储库接口。它们中的大多数都包含非常类似的方法,如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的方法。难看。
我正在寻找能让我自己踢的解决方案。
答案 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?
要点是,域名通常不能一概而论,另一种方法是有序的。我给出了一个使用特定于域的接口但使用通用基类的示例。