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的方法.丑陋.
我正在寻找能让我自己踢的解决方案.
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)
| 归档时间: |
|
| 查看次数: |
345 次 |
| 最近记录: |