gpt4 book ai didi

generics - 通用起订量存储库 - GetById(int i) 返回 T

转载 作者:行者123 更新时间:2023-12-03 06:54:13 27 4
gpt4 key购买 nike

我有一个通用存储库,我正在尝试为我的单元测试创​​建最小起订量实现。我需要创建一个 GetById 方法。这是我决定将其转换为使用泛型之前的最小起订量实现。

mockUserRepository.Setup(r => r.GetById(It.IsAny<int>()))
.Returns((int i) => users.Where(u => u.Id == i).Single());

通用存储库将用于最小起订量设置

Mock<IRepository<T>> mockRepository

假货的通用列表将用于 LINQ where 子句

List<T> list

谁能帮我转换一下上面的方法。

最佳答案

我不太确定你在问什么。如果您只想创建通用存储库的模拟,设置是相同的。

如果您想要一个辅助方法来为任何实体类型创建存储库,这是可行的。您必须在实体上实现一个接口(interface)来检索 ID,或者将委托(delegate)传递给帮助器方法。这是 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 ,但搜索并用 Guid 替换 int 效果不佳。 ;)

关于generics - 通用起订量存储库 - GetById(int i) 返回 T,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8679105/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com