繁体   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