我不完全确定你在问什么。如果你只是想创建一个通用库的模拟,那么设置是一样的。
如果你想要一个辅助方法为任何实体类型创建一个存储库,那是可行的。您必须在实体上实现接口来检索ID或将委托传递给辅助方法。这是一个LINQPad示例,显示了第一种技术。
void Main()
{
var users = new List<User>
{ new User { Id = 1 }, new User { Id = 2 } };
var mockUserRepository = new Mock<IUserRepository>();
mockUserRepository.Setup(r => r.GetById(It.IsAny<int>()))
.Returns((int i) => users.Where(u => u.Id == i).Single());
mockUserRepository.Object.GetById(2).Dump();
var mockUserRepository2 = new Mock<IRepository<User>>();
mockUserRepository2.Setup(r => r.GetById(It.IsAny<int>()))
.Returns((int i) => users.Where(u => u.Id == i).Single());
mockUserRepository2.Object.GetById(2).Dump();
IRepository<User> userRepository3 = CreateTestRepository(users);
userRepository3.GetById(2).Dump();
}
public static IRepository<TEntity> CreateTestRepository<TEntity>(
List<TEntity> entities)
where TEntity: IPrimaryKeyed
{
var mockRepository = new Mock<IRepository<TEntity>>();
mockRepository.Setup(r => r.GetById(It.IsAny<int>()))
.Returns((int i) => entities.Where(e => e.Id == i).Single());
return mockRepository.Object;
}
public interface IPrimaryKeyed
{
int Id { get; }
}
public class User : IPrimaryKeyed
{
public int Id { get; set; }
}
public interface IUserRepository
{
User GetById(int id);
}
public interface IRepository<T>
{
T GetById(int id);
}
另外,假设您的ID始终是整数是有风险的。您可能会考虑在整个代码库中使用int
类型泛型(当用于引用ID /主键时)。通常我会调用YAGNI,但搜索和替换int
与Guid
不能正常工作。 ;)