声明 DI 对象的最佳方式
Optimal way of declaring DI objects
我有一个 .net API 并且我的 Program.cs 已经开始变得相当臃肿了:
.
.
.
//core mappers
builder.Services.AddSingleton<IAppData_Mapper, AppData_Mapper>();
builder.Services.AddSingleton<IUserData_Mapper, UserData_Mapper>();
//pylon export services
builder.Services.AddTransient<IPylonItemExportService, PylonItemExportService>();
builder.Services.AddTransient<IPylonContactExportService, PylonContactExportService>();
//pylon repositories
builder.Services.AddSingleton<IPylonContactRepository, PylonContactRepository>();
builder.Services.AddSingleton<IPylonConnectionRepository, PylonConnectionRepository>();
builder.Services.AddSingleton<IPylonItemRepository, PylonItemRepository>();
builder.Services.AddSingleton<IPylonContactExportRepository, PylonContactExportRepository>();
builder.Services.AddSingleton<IPylonItemExportRepository, PylonItemExportRepository>();
builder.Services.AddSingleton<IPylonDocumentRepository, PylonDocumentRepository>();
builder.Services.AddSingleton<IPylonCentLineRepository, PylonCentLineRepository>();
builder.Services.AddSingleton<IPylonComEntryRepository, PylonComEntryRepository>();
builder.Services.AddSingleton<IPylonSupplierRepository, PylonSupplierRepository>();
builder.Services.AddSingleton<IPylonCustomerRepository, PylonCustomerRepository>();
//pylon sync services
builder.Services.AddTransient<IPylonItemSyncService, PylonItemSyncService>();
builder.Services.AddTransient<IPylonContactSyncService, PylonContactSyncService>();
builder.Services.AddTransient<IPylonMeasurementunitSyncService, PylonMeasurementunitSyncService>();
builder.Services.AddTransient<IPylonDocEntrySyncService, PylonDocEntrySyncService>();
builder.Services.AddTransient<IPylonCentLineSyncService, PylonCentLineSyncService>();
builder.Services.AddTransient<IPylonCommEntrySyncService, PylonCommEntrySyncService>();
builder.Services.AddTransient<IPylonCustomerSyncService, PylonCustomerSyncService>();
builder.Services.AddTransient<IPylonSupplierSyncService, PylonSupplierSyncService>();
.
.
.
将这些移出我的 program.cs 的最佳方式是什么?理想情况下,我希望它们位于单独的 class 中,将通过 Program.cs
调用
- 我可以将构建器传递给将添加服务的静态方法吗?
- 我可以创建服务数组并执行类似 Services.AddRange 的操作吗?
我对 .net 上的 DI 体系结构还很陌生,非常感谢任何指南!
要回答您的第一个问题,您可以通过创建一个新的 class 并将该方法接受 builder
并注册服务然后 return 或创建扩展方法。创建扩展方法稍微“整洁”一点,您可以这样做。
public static class MyServiceExtension
{
public static IServiceCollection AddMyServices(this IServiceCollection services)
{
// add your services
return services;
}
}
现在在您的 Program.cs
中,您要做的就是。
builder.Services.AddMyServices();
我有一个 .net API 并且我的 Program.cs 已经开始变得相当臃肿了:
.
.
.
//core mappers
builder.Services.AddSingleton<IAppData_Mapper, AppData_Mapper>();
builder.Services.AddSingleton<IUserData_Mapper, UserData_Mapper>();
//pylon export services
builder.Services.AddTransient<IPylonItemExportService, PylonItemExportService>();
builder.Services.AddTransient<IPylonContactExportService, PylonContactExportService>();
//pylon repositories
builder.Services.AddSingleton<IPylonContactRepository, PylonContactRepository>();
builder.Services.AddSingleton<IPylonConnectionRepository, PylonConnectionRepository>();
builder.Services.AddSingleton<IPylonItemRepository, PylonItemRepository>();
builder.Services.AddSingleton<IPylonContactExportRepository, PylonContactExportRepository>();
builder.Services.AddSingleton<IPylonItemExportRepository, PylonItemExportRepository>();
builder.Services.AddSingleton<IPylonDocumentRepository, PylonDocumentRepository>();
builder.Services.AddSingleton<IPylonCentLineRepository, PylonCentLineRepository>();
builder.Services.AddSingleton<IPylonComEntryRepository, PylonComEntryRepository>();
builder.Services.AddSingleton<IPylonSupplierRepository, PylonSupplierRepository>();
builder.Services.AddSingleton<IPylonCustomerRepository, PylonCustomerRepository>();
//pylon sync services
builder.Services.AddTransient<IPylonItemSyncService, PylonItemSyncService>();
builder.Services.AddTransient<IPylonContactSyncService, PylonContactSyncService>();
builder.Services.AddTransient<IPylonMeasurementunitSyncService, PylonMeasurementunitSyncService>();
builder.Services.AddTransient<IPylonDocEntrySyncService, PylonDocEntrySyncService>();
builder.Services.AddTransient<IPylonCentLineSyncService, PylonCentLineSyncService>();
builder.Services.AddTransient<IPylonCommEntrySyncService, PylonCommEntrySyncService>();
builder.Services.AddTransient<IPylonCustomerSyncService, PylonCustomerSyncService>();
builder.Services.AddTransient<IPylonSupplierSyncService, PylonSupplierSyncService>();
.
.
.
将这些移出我的 program.cs 的最佳方式是什么?理想情况下,我希望它们位于单独的 class 中,将通过 Program.cs
调用- 我可以将构建器传递给将添加服务的静态方法吗?
- 我可以创建服务数组并执行类似 Services.AddRange 的操作吗?
我对 .net 上的 DI 体系结构还很陌生,非常感谢任何指南!
要回答您的第一个问题,您可以通过创建一个新的 class 并将该方法接受 builder
并注册服务然后 return 或创建扩展方法。创建扩展方法稍微“整洁”一点,您可以这样做。
public static class MyServiceExtension
{
public static IServiceCollection AddMyServices(this IServiceCollection services)
{
// add your services
return services;
}
}
现在在您的 Program.cs
中,您要做的就是。
builder.Services.AddMyServices();