网络核心:启动类中的ILogger:封装在扩展方法中

时间:2019-07-30 17:57:20

标签: c# logging .net-core .net-core-2.2 ilogger

我在Net Core中编写了此日志记录代码,有人提到“可以将其封装在扩展方法中”。这是一种更简便的方法,可以在Net Core 2.2中进行最佳编写吗?

Startup.cs

        services.AddSingleton<ILoggerFactory, LoggerFactory>();
        services.AddSingleton(typeof(ILogger<>), typeof(Logger<>));
        services.AddLogging(builder => builder.SetMinimumLevel(Microsoft.Extensions.Logging.LogLevel.Trace));

4 个答案:

答案 0 :(得分:0)

虽然这不是一个纯粹的stackoverflow问题,但我想我可以提供一个意见:

方法ConfigureServices的问题在于,您需要定义所有依赖项,对于大型系统,这可能意味着痛苦的长配置方法,这实际上很难维护。

要解决此问题,您可以通过划分所有配置来简化启动,要实现这一点,可以使用C#的extension methods,该方法允许“扩展”一个类(添加更多方法),而无需修改类的源代码。

扩展方法很简单,只需将静态类与静态方法一起使用:

public static class CommonServicesExtension
{

    public static IServiceCollection AddCommonServices(IServiceCollection services)
    {
        services.AddHttpClient();
        services.AddNodaDateTime();
        services.AddMemoryCache();
        services.AddCurrencyExchange();
        // Add and configure many things

        return services;
    }
}

现在您可以像这样使用它:

CommonServicesExtension.AddCommonServices(serviceColletion);

但这有点丑陋且难以阅读,因此,只需在扩展方法中添加this

public static IServiceCollection AddCommonServices(this IServiceCollection services)

有了此更改,您可以像配置net core一样调用您的配置!

services.AddCommonServices();

在您的配置服务中,通过这种方式,您的配置方法从

public IServiceCollection ConfigureServices(IServiceCollection services)
{
    services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_2);
    services.AddTransient<IHttpContextAccessor, HttpContextAccessor>();

    services.AddDbContext<CoreContext>(options => options.UseMySql(Configuration.GetConnectionString("Core")));
    services.AddDbContext<CoreReadOnlyContext>(options => options.UseMySql(Configuration.GetConnectionString("CORE_READONLY")));
    services.AddDbContext<StatsContext>(options =>
        options.UseMySql(Configuration.GetConnectionString("Stats")));


    services.AddScoped<ProfileTokenGenerator>();
    services.AddTransient<MailNotificationService>();
    services.AddTransient<RegisterControllerService>();

    services.AddScoped<OtherClass>();
    services.AddTransient<MoreTransient>();
    services.AddTransient<ThingsService>();

    return services;
}

收件人

public IServiceCollection ConfigureServices(IServiceCollection services)
{
    services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_2);
    services.AddContexts();
    services.AddCommonServices();
    services.AddOtherServices();
    return services;
}

如您所见,更干净,更易于阅读!

答案 1 :(得分:0)

创建一个静态文件,例如;

public static class StartupConfiguration
{
    public static void AddMyLogging(
        this IServiceCollection services)
    {
        services.AddSingleton<ILoggerFactory, LoggerFactory>();
        services.AddSingleton(typeof(ILogger<>), typeof(Logger<>));
        services.AddLogging(builder => builder.SetMinimumLevel(Microsoft.Extensions.Logging.LogLevel.Trace));
    }
}

然后在您的Startup类中:

    public void ConfigureServices(
        IServiceCollection services)
    {
        services.AddMyLogging();
    }

答案 2 :(得分:-1)

好吧,可以通过编写AddLogging扩展方法的相同方法来完成。

public static IServiceCollection AddCustomLogging (this IServiceCollection services) {  
    services.AddSingleton<ILoggerFactory, LoggerFactory>();
    services.AddSingleton(typeof(ILogger<>), typeof(Logger<>));
    services.AddLogging(builder => builder.SetMinimumLevel(Microsoft.Extensions.Logging.LogLevel.Trace)); 
}

答案 3 :(得分:-1)

仅调用AddLogging扩展方法就足够了。

services.AddLogging(builder => builder.SetMinimumLevel(Microsoft.Extensions.Logging.LogLevel.Trace)); 

因为,如果您看一下此扩展方法的实现,您会发现ILoggerFactoryILogger<>已经应该添加到服务中。

services.TryAdd(ServiceDescriptor.Singleton<ILoggerFactory, LoggerFactory>());
services.TryAdd(ServiceDescriptor.Singleton(typeof (ILogger<>), typeof (Logger<>)));