[英]Dependency Injection for 1 function in another service
依賴注入有點新,但到目前為止我喜歡它。 用接口設置我的所有服務,以便我可以模擬用於單元測試的服務,一切都很好。
我來到了其中我需要從另一項服務訪問的一項服務中的功能。 可以僅通過訪問一項功能就注入整個服務嗎?
我的模塊服務中有一個刪除功能(標記為刪除),我還需要刪除該模塊的所有相關頁面。 由於用戶也可以刪除頁面,因此我將所有頁面代碼都放在了PageService中,並將所有模塊代碼都放在了ModuleService中。 這是在一個地方,我不必在每個服務中都重新輸入代碼。 在我的實際代碼中,我不僅在這兩個服務上擁有此功能。
所以這是我的例子
public interface IModuleService
{
Task<int> DeleteAsync(Module entity);
Task<int> DeleteAsync(Module entity, bool saveChanges);
}
public interface IPageService
{
Task<int> DeleteAsync(Page entity);
Task<int> DeleteAsync(Page entity, bool saveChanges);
}
public ModuleService : IModuleService
{
public Task<int> DeleteAsync(Module entity)
{
return DeleteAsync(entity, true);
}
public async Task<int> DeleteAsync(Module entity, bool saveChanges)
{
foreach (var page in entity.Pages)
await _pageService.DeleteAsync(page);
entity.IsDeleted = true;
if (saveChanges)
return await _context.SaveChangesAsync();
else
return await Task.FromResult<int>(1);
}
private IDbContext _context;
private IPageService _pageService;
public ModuleService(IDbContext context, IPageService pageService)
{
_context = context;
_pageService = pageService;
}
}
public PageService : IPageService
{
public Task<int> DeleteAsync(Page entity)
{
return DeleteAsync(entity, true);
}
public async Task<int> DeleteAsync(Page entity, bool saveChanges)
{
// you can see that i have injected yet another service into this
foreach (var item in entity.Children)
await _itemService.DeleteAsync(item);
entity.IsDeleted = true;
if (saveChanges)
return await _context.SaveChangesAsync();
else
return await Task.FromResult<int>(1);
}
private IDbContext _context;
private IItemService _itemService;
public PageService(IDbContext context, IItemService itemService)
{
_context = context;
_itemService = itemService;
}
}
現在,用戶可以通過調用來刪除模塊
_moduleService.DeleteAsync(myModule);
並且還會刪除所有相關頁面,並且每個頁面相關的項目並調用一次SaveChangesAsync,因此其所有事務都是1次的。
用戶也可以通過調用來刪除頁面
_pageService.DeleteAsync(myPage);
並且還會刪除所有相關項,然后再次調用SaveChangesAsync。
這是依賴注入實現的正確方法嗎? 注入整個服務,以便我可以訪問1種方法?
對於我來說,可以為一個功能注入整個(但很少)服務。 但我建議您設置級聯delete = true(如果可能)。 在這種情況下,您可以刪除許多代碼,也許在此示例中根本不需要依賴注入。
更新如果將模塊和頁面存儲在數據庫中,則可以為模塊->頁面外鍵設置CascadeDelete = true選項。 在這種情況下,如果刪除適當的模塊,數據庫將自動刪除所有頁面。 頁面和子項相同。 至少您將能夠foreach (var page in entity.Pages) await _pageService.DeleteAsync(page);
中為foreach (var page in entity.Pages) await _pageService.DeleteAsync(page);
刪除這段代碼foreach (var page in entity.Pages) await _pageService.DeleteAsync(page);
這個foreach (var item in entity.Children) await _itemService.DeleteAsync(item);
結果,您將不再需要_pageService
和_itemService
變量,因此根本不需要依賴項注入
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.