我在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));
答案 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));
因为,如果您看一下此扩展方法的实现,您会发现ILoggerFactory
和ILogger<>
已经应该添加到服务中。
services.TryAdd(ServiceDescriptor.Singleton<ILoggerFactory, LoggerFactory>());
services.TryAdd(ServiceDescriptor.Singleton(typeof (ILogger<>), typeof (Logger<>)));