Напишите Метод ConfigureServices В Другом Файле Класса

#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));

     }
}