gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 22:04:52 24 4
gpt4 key购买 nike

我仍在努力为 asp mvc 应用程序制作良好的数据访问层,而且一如既往地缺少一些东西:)
我已经为 DAL 创建了单独的程序集,我正在使用存储库模式并为 IOC 注入(inject)。
问题是现在我不知道如何编写自定义方法(通用 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>();
}
...

通用存储库接口(interface):

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;
}

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

最佳答案

您的 ICountryRepository 实现应继承 GenericRepository。 GenericRepository 具有对数据库上下文的引用,您可以将其用于自定义查询。对于您的 Generic Repository 构造函数,使用 MainContext 而不是 IMainContext 会容易得多,如果您继续通过层向下注入(inject)它就可以了。使用 Ninject,您需要像这样绑定(bind) MainContext:

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

以及您的其他具体实现接口(interface)。因此,您的每个存储库都将通过 GenericRepository 获得上下文,它引用了您的数据库上下文,您可以在存储库中进行自定义查询。如果你有一个服务层,注入(inject)存储库的接口(interface):

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 不需要是虚拟的。这里的主要变化是你需要通过国家存储库构造函数将上下文传递给基础,并且上下文和国家数据库集需要是公共(public)的,即使是在继承时也是如此。参见这篇文章:Are private members inherited in C#?

关于c# - 使用通用存储库时如何编写自定义方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24810490/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com