如何在 ASP.net Core c# 中创建自己的 ServiceCollectionExtension 并将依赖项作为参数传递

问题描述 投票:0回答:1

我尝试为我的服务“FdmMediator”创建自己的 ServiceCollectionExtension。

我想将服务“FdmMediator”注册为单例,并且需要传递一些参数。参数也提前注入到容器中。

创建“FdmMediator”所需的参数是 ILoggerFactory、从 appsetting.json 和存储库加载的设置。

我使用 serilog 作为应用程序记录器,并将 appsetting.json 中的应用程序设置保存为

IOption<GlobalSettings>

// Logger
Log.Logger = new LoggerConfiguration()
    .ReadFrom.Configuration(builder.Configuration)
    .CreateLogger();

builder.Logging.AddSerilog();

// application settings
builder.Services.Configure<GlobalSettings>(builder.Configuration.GetSection("ApplicationSettings"));

// Where I want to use my extensions
builder.Services.AddFdmMediator()

// Other code...

var app = builder.Build();

// ...

稍后在代码中我在容器中注册我的存储库

builder.Services.AddTransient<IApplicationTraceRepository, ApplicationTraceRepository>();

要创建 FdmMediator 类的新实例,我需要传递注册的参数。

public class FdmMediator
{

    private readonly ILogger _logger;
    private readonly IApplicationTraceRepository _errorRepository;
    private readonly GlobalSettings _settings;

    public FdmMediator(ILogger logger, IApplicationTraceRepository errorRepository, IOptions<GlobalSettings> s)
    {
        _logger = logger;
        _errorRepository = errorRepository;
        _settings = s.Value;
    }
}

在我的 IServiceCollection 扩展中,我想根据programm.cs中配置的 serilog 记录器创建一个新记录器。

 public static class FdmMediatorBuilderExtensions
 {

     public static IServiceCollection AddFdmMediator(this IServiceCollection services, ILoggerFactory factory, IApplicationTraceRepository rep, IOptions<GlobalSettings> settings)
     {
         // Create Mediator
         // The logger factory should create a new serilog-logger based on the same settings as configured in the programm.cs
         var l = factory.CreateLogger(nameof(FdmMediator));

         var m = new FdmMediator(l, rep, settings);

         // Add as singleton
         services.AddSingleton<FdmMediator>(m);

         return services;
         
     }
 }

我应该怎么做才能从容器中获取参数并传递它们,以将我的“FdmMediator”创建为单例?我如何从之前创建的 Serilogger 中获取 ILoggerFactory。

c# asp.net-core asp.net-web-api dependency-injection extension-methods
1个回答
0
投票

在这种情况下不需要扩展方法。所有构造函数参数都已注册。唯一的问题是记录器依赖项的类型是

ILogger
而不是
ILogger<FdmMediator>
。日志中间件将使用类型的名称作为日志消息的类别。

如果将构造函数签名更改为:

public FdmMediator(ILogger<FdmMediator> logger, 
                   IApplicationTraceRepository errorRepository, 
                   IOptions<GlobalSettings> s)

您应该能够注册课程:

services.AddSingleton<FdmMediator>();
© www.soinside.com 2019 - 2024. All rights reserved.