我有一个实体课

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这样的东西,它告诉您如何将不同的类型映射到不同的表。

09-28 07:38