我有一个实体课
public partial class Product
{
public int ProductId { get; set; }
public string ProductName { get; set; }
}
和这个实体
public partial class User
{
public User()
{
this.Tokens = new HashSet<Token>();
}
public int UserId { get; set; }
public string UserName { get; set; }
public string Password { get; set; }
public string Name { get; set; }
public virtual ICollection<Token> Tokens { get; set; }
}
我有一个存储库模式
public abstract class DataRepositoryBase<T> : IDataRepository<T>
where T : class, new()
{
protected abstract T AddEntity(T entity);
protected abstract T UpdateEntity(T entity);
protected abstract IEnumerable<T> GetEntities();
protected abstract T GetEntity(int id);
}
我如何使用通用数据存储库(例如
this.<T>
之类的东西)使用通用接口而不创建新类来调用存储库?谢谢。_datarepositorypattern.GetDataRepository<IProductRepository>();
_datarepositorypattern.GetDataRepository<IUserRepository>();
我想要的是这样的东西。
var obj = _datarepositorypattern.GetDataRepository<IDataRepository<User>>();
//then i can access use
obj.GetEntities();
更新
我已经创建了存储库
该存储库可以返回
public DataRepositoryBase<Product> ProductRepository => new ProductRepository();
在服务等级
private readonly UnitOfWork _unitOfWork;
public ProductServices(UnitOfWork unitOfWork)
{
_unitOfWork = unitOfWork;
}
Product[] IProductServices.GetProduct()
{
var repository = _unitOfWork.ProductRepository;
return repository.Get().ToArray();
}
我使用这种当前的存储库方法。
我想要创建动态存储库,因此我不必再次更新存储库,而仅使用这样的代码更新服务类。
var obj = _datarepositorypattern.GetDataRepository<IProductRepository>();
obj.GetEntities();
仅使用存储库存储库模式,我就可以获得动态存储库产品
var obj = _datarepositorypattern.GetDataRepository<IUserRepository>();
obj.GetEntities();
仅使用存储库存储库模式,我就可以获得动态存储库用户。
更新
我只是谷歌搜索这是一个repositoryfactorypattern,任何人都可以帮助我。
最佳答案
正如您在此处编写的一样,您需要新的课程。您指定IProductRepository和IUserRepository
这意味着您需要
class UserRepository : DataRepositoryBase<User>, IUserRepository
{
//userrepository code here
}
否则你会得到类似
_datarepositorypattern.GetDataRepository<IDataRepository<User>>();
特别是因为您的datarepository类是抽象的,所以您需要在某个地方进行具体的实现
更新:不使用实体特定存储库的示例
如果您真的想避免特定于实体的存储库,则可以轻而易举地查看。
你仍然需要像泰西斯这样的东西
class MyContext : DbContext {
DbSet<Product> Products {get; set;}
DBSet<User> Users {get; set;}
}
但是您可以像这样调用上下文提供者
public class DataRepositoryBase<T> : IDataRepository<T> {
readonly EFContextProvider<User> _contextProvider =
new EFContextProvider<User>();
public void SaveEntity(JObject saveBundle) {
_contextProvider.SaveChanges(saveBundle);
}
}
现在您可以只调用新的DataBaseObjectRepository()(或在GetDataRepository方法中使用该代码)
也许那是一个起点。您确实需要像DbContext这样的东西,它告诉您如何将不同的类型映射到不同的表。