繁体   English   中英

使用通用存储库时如何编写自定义方法

[英]How to write custom methods when using generic repository

我仍然在努力为ASP MVC应用程序提供良好的数据访问层,并且一如既往地缺少某些东西:)
我已经为DAL创建了单独的程序集,并且正在使用存储库模式和用于IOC的ninject。
问题在于,现在我不知道如何编写自定义方法(通用CRUD方法中的方法)。
这是实现:
上下文类:

public class MainContext : IdentityDbContext<ApplicationUser, ApplicationRole, int, ApplicationUserLogin, ApplicationUserRole, ApplicationUserClaim>, IMainContext
    {
        public MainContext()
            : base("DefaultConnection")
        {
        }
        ...
        public DbSet<Country> Countries { get; set; }
        ...
        public new IDbSet<TEntity> Set<TEntity>() where TEntity : class
        {
            return base.Set<TEntity>();            
        }

库:

public interface ICountryRepository : IGenericRepository<Country>...

通用存储库:

public class GenericRepository<TEntity> : IGenericRepository<TEntity> where TEntity : class
    {
        private readonly IMainContext _context;
        private readonly IDbSet<TEntity> _dbSet;

        public GenericRepository(IMainContext context)
        {
            this._context = context;
            this._dbSet = context.Set<TEntity>();
        }
        ...

通用存储库接口:

public interface IGenericRepository<TEntity> where TEntity : class
    {
        IEnumerable<TEntity> Get(
            Expression<Func<TEntity, bool>> filter = null,
            Func<IQueryable<TEntity>, IOrderedQueryable<TEntity>> orderBy = null,
            string includeProperties = "");

        TEntity GetByID(object id);

        void Insert(TEntity entity);

        void Delete(object id);

        void Delete(TEntity entityToDelete);

        void Update(TEntity entityToUpdate);
    }

这是尝试在存储库类中添加自定义方法:

public virtual IEnumerable<Country> GetByLocation(float location)
        {
            var data = from c in _context...
            return data;
        }

但是我没有上下文。
我不知道现在如何实现获取数据。
我应该以某种方式注入它还是通过new关键字创建实例(但我想这是错误的)
现在如何实现自定义方法?

您的ICountryRepository实现应继承GenericRepository。 GenericRepository具有对db上下文的引用,您可以将其用于自定义查询。 对于您的通用存储库构造函数而言,使用MainContext而不是IMainContext会容易得多,如果您不断将其注入各层,则可以。 使用Ninject,您将需要像这样绑定MainContext:

kernel.Bind<MainContext>().ToSelf().InRequestScope();

以及其余接口到具体实现。 因此,您的每个存储库都将通过GenericRepository拥有上下文,该上下文具有对数据库上下文的引用,您可以在存储库中进行自定义查询。 如果您有服务层,请注入存储库的接口:

private readonly ICountryRepository _repository;

public SomeServie(ICountryRepository repository){
   _repository = repository;
}

public void DoSomething(float locationId){
   _repository.GetByLocation(locationId);
}

这里是您需要的其他代码:

 public class CountryRepository : GenericRepository<Country>, ICountryRepository
    {

        public CountryRepository(MainContext mainContext) : base(mainContext) { }

        public IEnumerable<Country> GetByLocation(float location)
        {
            return this.Context.Countries.ToList();
        }

.....

 public class GenericRepository<TEntity> : IGenericRepository<TEntity> where TEntity : class
    {
        public MainContext Context { get; set; }
        public IDbSet<TEntity> DbSet { get; set; }

        public GenericRepository(MainContext context)
        {
            Context = context;
            DbSet = context.Set<TEntity>();
        }

.......

另外,您的GetCountries不必是虚拟的。 此处的主要更改是,您需要将上下文通过国家/地区存储库构造函数传递给基础,并且上下文和国家/地区数据库集也必须是公共的,即使是继承的。 请参阅本文: 私有成员是否在C#中继承?

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM