Başlangıç ​​sınıfına her şeyi eklemenin yanı sıra ASP.NET Core 3.1'de bağımlılıkları kaydetmenin sağlam bir yolu var mı?


9

Bir ASP.NET Core 3.1 projem var. Genellikle, sınıftaki ConfigureServices()yöntemi kullanarak herhangi bir bağımlılığı kayıt Startup.cs.

Ama kendimi çok fazla bağımlılık ve ConfigureServices()büyük görünüm kaydettirmek zorunda buluyorum Muhtemelen statik bir yöntem bir uzantısı yöntemi oluşturmak ve ConfigureService () `sınıfından çağırabilir, ancak daha iyi bir yolu olup olmadığını merak biliyorum.

Bağımlılıkları IoC kapsayıcısına böyle bir tanımlamak zorunda kalmadan kaydetmenin bir yolu varsa

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

Yanıtlar:


10

İlgili bağımlılıkları özel uzantı yöntemlerine göre gruplandırmak, bunu yapmanın çok yaygın bir yoludur. ASP.NET Core, birçok dahili hizmet için bunu zaten yapıyor ve bunun üzerine kolayca genişleyebilir ve bunları uygulamanız için ihtiyacınız olan şekilde ayarlayabilirsiniz. Örneğin, kimlik doğrulama ve yetkilendirme ayarlamak için:

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

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

    return services;
}

Aynı şeyi uygulamaya özgü hizmetler için yapabilir ve bunları mantıksal olarak ayrı uzantı yöntemlerinde gruplayabilirsiniz.

Çok benzer çok sayıda hizmet kaydınız varsa, kurallara dayalı bir kayıt da kullanabilirsiniz, örneğin Scrutor . Örneğin, bu, belirli bir ad alanındaki tüm hizmetleri ilgili arabirimleri için geçici olarak kaydeder:

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

Scrutor, hizmetleri taramak için çok karmaşık kurallara izin verir, bu nedenle hizmetleriniz bazı kalıpları takip ederse, bunun için bir kural belirtebilirsiniz .


3

Özel bir özellik oluşturma (AutoBindAttribute adı verilir)

public class AutoBindAttribute : Attribute
{
}

Körük gibi kullanın ([AutroBind] ile otomatik olarak bağlamak istediğiniz tüm uygulamaları süsleyin)

public interface IMyClass {}

[AutoBind]
public class MyClass : IMyClass {}

Şimdi IServiceCollection için bir genişletme yöntemi oluşturun

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();
    }
}

Şimdi Startup.cs dosyasında arayın

public class Startup
{

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

}

Not: ServiceCollectionExtentionsSınıfı, singleton vb. Gibi tüm kapsamları destekleyecek şekilde geliştirebilirsiniz . Bu örnek yalnızca Geçici yaşam için gösterilir.

Zevk almak!!!


0

Bahsedilene ek olarak.

Şahsen her derleme için ayrı bir sınıf kaydı bağımlılığı olmasını istiyorum Bu, sınıfları doğru katmanda kullanma konusunda daha fazla kontrol sağlar ve internalhangi IMO'nun iyi olmasını sağlar.

scanMekanizmaları kullanıp kullanmayacağınız size bağlıdır. Bazı çerçeveler bunu varsayılan olarak verir. Benzer bağımlılıkları bir grup sınıfta / yöntemde gruplamak, sırayla, herhangi bir değişiklik için mantığın tutarlı bir yerde çözülmesine yardımcı olmalıdır. Her iki yaklaşımı da birleştirebilirsiniz.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.