Я не совсем уверен, что вы спрашиваете.Если вы просто хотите создать макет универсального репозитория, настройка будет такой же.
Если вам нужен вспомогательный метод для создания репозитория для любого типа объекта, это выполнимо.Вы должны либо реализовать интерфейс на объектах для получения идентификатора, либо передать делегат вспомогательному методу.Вот пример 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);
}
Кроме того, предполагать, что ваши идентификаторы всегда будут целыми числами, рискованно.Вы можете подумать о том, чтобы сделать тип int
универсальным (когда он используется для ссылки на идентификаторы / первичные ключи) во всей базе кода.Обычно я бы вызывал YAGNI , но поиск и замена int
на Guid
не работает.;)