对另一个服务中的一个函数进行依赖注入

本文关键字:函数 一个 注入 依赖 服务 另一个 | 更新日期: 2023-09-27 18:01:46

依赖注入有点新,但到目前为止我喜欢它。用接口设置我所有的服务,这样我就可以模拟单元测试的服务,一切都好。

我已经到了一个部分,我有一个功能在一个服务,我需要从另一个服务访问。是否可以注入整个服务来访问那个函数?

我在我的模块服务中有一个删除功能(标记为删除),我还需要删除该模块的所有相关页面。因为用户也可以删除一个页面,所以我把所有的页面代码放在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一次,所以它都在一个事务。

用户也可以通过调用

删除页面
_pageService.DeleteAsync(myPage);

,它也会删除所有相关的项目,并再次调用SaveChangesAsync一次。

这是使用依赖注入的正确方法吗?注入整个服务,这样我就可以访问一个方法?

对另一个服务中的一个函数进行依赖注入

对于我来说,在您的情况下为一个函数注入整个(但很少)服务是可以的。但我建议你设置cascade delete = true,如果可能的话。在这种情况下,你可以删除很多代码,也许在这个例子中你根本不需要依赖注入。

如果您将模块和页面存储在数据库中,您可以为模块->页面外键设置CascadeDelete = true选项。在这种情况下,如果删除适当的模块,数据库将自动删除所有页面。page和它的子节点也是一样。至少您将能够删除这段代码foreach (var page in entity.Pages) await _pageService.DeleteAsync(page);这个foreach (var item in entity.Children) await _itemService.DeleteAsync(item);
因此,您将不需要任何更多的_pageService_itemService变量,因此根本不需要依赖注入