簡體   English   中英

另一個服務中1個功能的依賴注入

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM