这是我对域模型和通用存储库的设计
public interface IEntity
{
long Id { get; }
}
public interface IRepository<T> where T : class, IEntity, new()
{
void Save(T entity);
void Delete(long id);
T Get(long id);
IEnumerable<T> GetAll();
}
public interface IUserRepository : IRepository<User>
{
User Login(string username, string password);
}
public class User : IEntity
{
// Implementation of User
}
public abstract class BaseRepository<T> : IRepository<T> where T : class, IEntity, new()
{
// Implementation of IRepository
}
public class UserRepository : BaseRepository<User>, IUserRepository
{
// Implementation of IUserRepository
// Override BaseRepository if required
}
当我想实例化一个存储库实例时,我使用一个实现以下接口的工厂
public interface IRepositoryFactory
{
R CreateRepository<R, T>()
where R : IRepository<T>
where T : class, IEntity, new();
}
并使用工厂对象如下
1. IRepositoryFactory factory = CreateFactory();
2. IUserRepository repository = factory.CreateRepository<IUserRepository, User>();
3. User user = repository.Login("user", "1234");
我的问题在第二行。我想用我的工厂就好了。
// Without specifying the User type parameter
factory.CreateRepository<IUserRepository>()
由于我的 IRepository 接口对实体类型有约束,我的工厂使用相同的约束来满足 IRepository 要求。
有没有办法将此参数与客户端隔离?