我有一個通用服務,它的定義如下:
public interface IGenericService<T> : IDisposable
where T : class, IModel
{
Task<bool> Add(T entity);
Task<bool> AddOrUpdate(T entity);
Task<bool> Update(T entity);
Task<T?> Get(int id);
Task<bool> Exists(int id);
Task<IEnumerable<T>> GetAll();
Task<bool> Delete(T entity);
Task<IEnumerable<T>> GetAll(int numberOfElements, int page);
Task<int> NumberOfEntries();
Task<T?> Refresh(T entity);
}
這是在GenericService.cs. 這很好用,即使是子類,例如“MyService.cs”。我目前正在清理代碼,但發現了一個問題,我對此并不滿意。
如果MyService與模板型別MyClass有關系,MyOtherClass并且我想使用我的通用 Get-Method,我不會收到MyOtherClass. 因此,我需要MyService使用相應的包含創建一個新的 Get-Method,它看起來像這樣:
public new async Task<MyClass?> Get(int id)
{
try
{
return await this.Context.Set<MyClass>().Include(c => c.MyOtherClass).FirstOrDefaultAsync(d => d.Id == id);
}
catch (Exception)
{
return null;
}
}
這本身不是問題,但我開始想辦法為所有子類一般加載包含。這意味著,對于我的幾乎所有服務,我只有一個 Get-Method 實作,而不是一個單獨的實作。
我的想法是,在 中GenericService,我添加了一個抽象方法:
protected abstract IEnumerable<string> GetIncludes();
然后在 GenericService 的 Get-Method 中呼叫它:
public async Task<TModel?> Get(int id)
{
try
{
var query = this.Context.Set<TModel>();
foreach (var include in this.GetIncludes())
{
query.Include(include);
}
return await query.FindAsync(id);
}
catch (Exception)
{
return null;
}
}
然后,在我的子類中,我只需像這樣實作抽象方法:
protected override IEnumerable<string> GetIncludes()
{
return new List<string>() { "MyOtherClass" };
}
問題是,這種方法似乎不起作用。如果我除錯我的 GenericService 的 Get-Method,我會得到正確的包含串列,并且 for 回圈會正確執行,但 MyOtherClass 始終為空。(它顯然有效,當我覆寫 Get 方法并直接撰寫時this.Context.Set<MyClass>().Include(c => c.MyOtherClass))
uj5u.com熱心網友回復:
您忘記分配修改后的查詢:
query = query.Include(include);
public async Task<TModel?> Get(int id)
{
try
{
var query = this.Context.Set<TModel>().AsQueryable();
foreach (var include in this.GetIncludes())
{
query = query.Include(include);
}
return await query.FirstOrDefaultAsync(m => m.Id == id);
}
catch (Exception)
{
return null;
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/463240.html
上一篇:獲取列舉的ToString方法
下一篇:從物體框架接收資料的執行程式
