#c# #asp.net #asp.net-core #dependency-injection
Вопрос:
У нас в компании есть шаблон для наших проектов, в котором они пишут методы AddTransient<>() внутри другого класса. Я хочу знать, как поместить метод запуска ConfigureServices в другой класс.
Видите ли, у нас есть очень простой стартап-проект, подобный этому:
public class Startup
{
public Startup(IConfiguration configuration)
{
Configuration = configuration;
}
public IConfiguration Configuration { get; }
// This method gets called by the runtime. Use this method to add services to the container.
public void ConfigureServices(IServiceCollection services)
{
services.AddControllers();
services.AddTransient<LocationService, LocationService>();
services.AddTransient<PersonService, PersonService>();
services.AddTransient<UserService, UserService>();
services.AddAutoMapper(typeof(Startup));
}
// This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
app.UseHttpsRedirection();
app.UseRouting();
app.UseAuthorization();
app.UseEndpoints(endpoints =>
{
endpoints.MapControllers();
});
}
}
Я хочу перенести свою (зависимую регистрацию класса) в другой класс внутри моего проекта.
Так что это будет мой новый стартап.cs:
public class Startup
{
public Startup(IConfiguration configuration)
{
Configuration = configuration;
}
public IConfiguration Configuration { get; }
// This method gets called by the runtime. Use this method to add services to the container.
public void ConfigureServices(IServiceCollection services)
{
services.AddControllers();
services.AddAutoMapper(typeof(Startup));
}
// This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
app.UseHttpsRedirection();
app.UseRouting();
app.UseAuthorization();
app.UseEndpoints(endpoints =>
{
endpoints.MapControllers();
});
}
}
И это будет моим примером Filename.cs :
public void ConfigureServices(IServiceCollection services)
{
services.AddTransient<LocationService, LocationService>();
services.AddTransient<PersonService, PersonService>();
services.AddTransient<UserService, UserService>();
}
Комментарии:
1. с базовым классом? этот класс может даже находиться в другой библиотеке
2. @Isparia да, по умолчанию он находится в другом проекте библиотеки классов. но я не знаю, как это сделать в моем собственном проекте.
3. Я не уверен, что полностью понимаю, о чем вы здесь спрашиваете. Но если вы хотите настроить некоторые службы в другом классе, вам просто нужен метод, которому вы можете передать
services
объект. Это довольно распространенный шаблон, который можно увидеть, и вы можете увидеть его вAddControllers
AddAutoMapper
методах расширения и, которые вы вызываете здесь.4. @DavidG Не могли бы вы, пожалуйста, написать пример?
Ответ №1:
Во-первых, вам нужно создать папку с именем Extensions, и там вы создадите имя файла, какое захотите. Я даю своему файлу имя ApplicationService.
Расширения/ApplicationServiceExtensions.cs
namespace API.Extensions
{
public static class ApplicationServiceExtensions
{
public static IServiceCollection AddApplicationServices(this IServiceCollection services, IConfiguration config)
{
services.AddTransient<LocationService, LocationService>();
services.AddTransient<PersonService, PersonService>();
services.AddTransient<UserService, UserService>();
return services;
}
}
}
startup.cs
private readonly IConfiguration _config;
public Startup(IConfiguration config)
{
_config = config;
}
public IConfiguration Configuration { get; }
//clarify code
public void ConfigureServices(IServiceCollection services)
{
services.AddApplicationServices(_config);
//clarify code
}
Итак,это пример помещения метода запуска ConfigureServices в другой класс. и которую ты хочешь.
Ответ №2:
Я напечатал это вслепую, но это то, чего ты хочешь?
public abstract class StartUpBase
{
public virtual void ConfigureServices(IServiceCollection services)
{
services.AddTransient<LocationService, LocationService>();
services.AddTransient<PersonService, PersonService>();
services.AddTransient<UserService, UserService>();
}
}
public class StartUp : StartUpBase
{
public override ConfigureServices(IServiceCollection services)
{
services.AddControllers();
base.ConfigureServices(services);
services.AddAutoMapper(typeof(Startup));
}
}
Альтернатива:
public static class Another
{
public static IServiceCollection AddTransitentServices(IServiceCollection services)
{
//add your transistent services here
return services;
}
}
public class StartUp
{
public override ConfigureServices(IServiceCollection services)
{
services.AddControllers();
services = Another.AddTransitentServices(services)
services.AddAutoMapper(typeof(Startup));
}
}