【问题标题】:Pass a service instance as a method parameter将服务实例作为方法参数传递
【发布时间】:2020-08-14 18:15:13
【问题描述】:

我有 2 项服务

MainService
PDFGeneratorService

它们是作用域

 services.AddScoped<IMainService

我想在参数中将MainService 实例传递给PDFGenerator 方法作为监听器:

示例实现:

public interface IFileGeneratorListener {
     Task <int> Notify(int fileId);
}


public class MainService: IMainService, IFileGeneratorListener {
    private readonly IPDFGeneratorService _pDFGeneratorService;

    public MainService(IPDFGeneratorService service) {
        _pDFGeneratorService = service;
    }

    public Task MainTask() {
        _pDFGeneratorService.Generate(1, this);
    }

    public Task<int> FileGeneratedNotification(int fileId) {
        Debug.Writeline($ "file {fileId} was generated");
    }

}

public class PDFGeneratorService: IPDFGeneratorService {
    public void Generate(int fileId, IFileGeneratorListener listener) {
        // generate the file....
        listener.Notify(fileId);
    }
}

这样可以吗?

【问题讨论】:

  • 看起来不错。这通常是与控制反转 (IoC) 一起使用的模式

标签: c# asp.net-core dependency-injection asp.net-core-2.2


【解决方案1】:

这里没有技术上的错误。它将编译并“工作”。然而,像这样的循环依赖是糟糕设计的标志。这意味着您正在这两个服务之间流血逻辑,因此您要么让服务做的比他们应该做的更多,要么没有在两个上下文之间明确划定界限。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-11-12
    • 2013-05-17
    • 1970-01-01
    • 1970-01-01
    • 2022-01-05
    • 1970-01-01
    • 2011-03-29
    相关资源
    最近更新 更多