如何在使用通用存储库时编写自定义方法
本文关键字:自定义方法 存储 | 更新日期: 2023-09-27 18:13:19
我仍然在努力为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上下文的引用,您可以将其用于自定义查询。对于你的Generic Repository构造函数来说,使用MainContext而不是IMainContext要容易得多,如果你一直往下注入它就可以了。使用Ninject,你需要像这样绑定MainContext:
kernel.Bind<MainContext>().ToSelf().InRequestScope();
和其他接口到具体实现。所以你的每个存储库都将通过GenericRepository拥有上下文,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不需要是虚拟的。这里的主要变化是,您需要通过国家存储库构造函数将上下文传递给base,并且上下文和国家数据库集需要是公共的,即使是继承的。在c#中私有成员是继承的吗?