对另一个服务中的一个函数进行依赖注入
本文关键字:函数 一个 注入 依赖 服务 另一个 | 更新日期: 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
变量,因此根本不需要依赖注入