Startup 클래스에 모든 것을 추가하는 것 외에 ASP.NET Core 3.1에서 종속성을 등록하는 강력한 방법이 있습니까?


9

ASP.NET Core 3.1 프로젝트가 있습니다. 일반적으로 클래스 의 ConfigureServices()메서드를 사용하여 종속성을 등록합니다 Startup.cs.

그러나 많은 의존성을 등록해야하고 ConfigureServices()외모가 엄청납니다! 정적 메서드의 확장 메서드를 만들어 ConfigureService () 클래스에서 호출 할 수는 있지만 더 좋은 방법이 있는지 궁금합니다.

이와 같이 한 번에 하나씩 정의하지 않고 IoC 컨테이너에 종속성을 등록하는 방법이있는 경우

services.AddScoped<Interface, Class>();
.... 200 lines later
services.AddScoped<ISettings, Settings>()

답변:


10

관련 종속성을 사용자 정의 확장 메소드로 그룹화하는 것이 가장 일반적인 방법입니다. ASP.NET Core는 이미 많은 내부 서비스에 대해이 작업을 수행하며, 그 위에 쉽게 확장하여 응용 프로그램에 필요한 방식으로 설정할 수 있습니다. 예를 들어 인증 및 권한을 설정하려면

public IServiceCollection AddSecurity(this IServiceCollection services)
{
    services.AddAuthentication()
        .AddCookie();

    service.AddAuthorization(options =>
    {
        options.DefaultPolicy = …;
    });

    return services;
}

응용 프로그램 별 서비스에 대해 동일한 작업을 수행하고 별도의 확장 방법으로 논리적으로 그룹화 할 수 있습니다.

매우 유사한 서비스 등록이 많은 경우 Scrutor 등 의 규칙 기반 등록을 사용할 수도 있습니다. 예를 들어, 특정 네임 스페이스 내의 모든 서비스를 해당 인터페이스의 임시 서비스로 등록합니다.

services.Scan(scan => scan
    .FromAssemblyOf<Startup>()
        .AddClasses(c => c.InNamespaces("MyApp.Services"))
            .AsImplementedInterfaces()
            .WithTransientLifetime()
);

Scrutor는 매우 복잡한 규칙을 통해 서비스를 검색 할 수 있으므로 서비스가 어떤 패턴을 따르는 경우 규칙을 따를 수 있습니다.


3

사용자 정의 속성 (AutoBindAttribute) 생성

public class AutoBindAttribute : Attribute
{
}

다음과 같이 사용하십시오 ([AutroBind]와 자동으로 바인딩하려는 모든 구현을 장식하십시오)

public interface IMyClass {}

[AutoBind]
public class MyClass : IMyClass {}

이제 IServiceCollection에 대한 확장 메소드를 작성하십시오.

public class ServiceCollectionExtentions
{
    public static void AutoBind(this IServiceCollection source, params Assembly[] assemblies)
    {
       source.Scan(scan => scan.FromAssemblies(assemblies)
        .AddClasses(classes => classes.WithAttribute<AutoBindAttribute>())
        .AsImplementedInterfaces()
        .WithTransientLifetime();
    }
}

이제 Startup.cs에서 호출하십시오.

public class Startup
{

    public void ConfigureServices(IServiceCollection services)
    {
        services.AutoBind(typeof(Startup).Assembly);
    }

}

참고 : ServiceCollectionExtentions싱글 톤 등과 같은 모든 범위를 지원 하도록 클래스를 향상시킬 수 있습니다 .이 예는 일시적 수명에 대해서만 표시됩니다.

즐겨!!!


0

언급 된 것 외에.

개인적으로 각 어셈블리마다 종속성을 등록하는 별도의 클래스를 갖고 싶습니다. 이를 통해 올바른 계층에서 클래스 사용에 대한 제어력 internal을 높이고 어떤 IMO가 적합한 지 결정할 수 있습니다 .

scan메커니즘 사용 여부 는 사용자에게 달려 있습니다. 일부 프레임 워크는 기본적으로이를 제공합니다. 클래스 / 메소드 세트에서 유사한 종속성을 그룹화하면 변경 사항에 대한 논리를 일관된 위치에 해결하는 데 도움이됩니다. 두 가지 접근 방식을 결합 할 수 있습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.