Có cách nào mạnh mẽ để đăng ký các phụ thuộc trong ASP.NET Core 3.1 bên cạnh việc thêm mọi thứ vào lớp Startup không?


9

Tôi có một dự án ASP.NET Core 3.1. Thông thường, tôi đăng ký bất kỳ sự phụ thuộc bằng cách sử dụng ConfigureServices()phương thức trong Startup.cslớp.

Nhưng, tôi thấy mình phải đăng ký rất nhiều phụ thuộc và ConfigureServices()ngoại hình rất lớn! Tôi biết có lẽ tôi có thể tạo một phương thức mở rộng của một phương thức tĩnh và gọi nó từ lớp ConfigureService () `, nhưng tự hỏi liệu có cách nào tốt hơn không.

Nếu có một cách để đăng ký các phụ thuộc trong bộ chứa IoC mà không phải xác định chúng một lần như thế này

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

Câu trả lời:


10

Nhóm các phụ thuộc liên quan vào các phương thức mở rộng tùy chỉnh là một cách rất phổ biến để làm điều này. ASP.NET Core đã thực hiện điều này cho nhiều dịch vụ nội bộ và bạn có thể dễ dàng mở rộng trên đó và thiết lập chúng theo cách bạn cần cho ứng dụng của mình. Ví dụ: để thiết lập xác thực và ủy quyền:

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

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

    return services;
}

Bạn có thể làm tương tự cho các dịch vụ dành riêng cho ứng dụng của mình và nhóm chúng một cách hợp lý theo các phương thức mở rộng riêng biệt.

Nếu bạn có nhiều đăng ký dịch vụ rất giống nhau, bạn cũng có thể sử dụng đăng ký dựa trên quy ước, ví dụ như sử dụng Scrutor . Ví dụ: điều này đăng ký tất cả các dịch vụ trong một không gian tên nhất định là tạm thời cho giao diện tương ứng của chúng:

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

Scrutor cho phép các quy tắc rất phức tạp để quét các dịch vụ, vì vậy nếu các dịch vụ của bạn tuân theo một số mẫu, bạn có thể sẽ đưa ra quy tắc cho điều đó.


3

Tạo một thuộc tính tùy chỉnh (được gọi là AutoBindAttribution)

public class AutoBindAttribute : Attribute
{
}

Sử dụng nó như dưới đây (Trang trí tất cả các triển khai mà bạn muốn tự động liên kết với [AutroBind])

public interface IMyClass {}

[AutoBind]
public class MyClass : IMyClass {}

Bây giờ hãy tạo một phương thức mở rộng cho 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();
    }
}

Bây giờ gọi nó trong Startup.cs

public class Startup
{

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

}

Lưu ý: Bạn có thể cải thiện ServiceCollectionExtentionslớp để hỗ trợ tất cả các phạm vi, chẳng hạn như singleton, v.v. Ví dụ này chỉ hiển thị trong suốt thời gian thoáng qua.

Thưởng thức!!!


0

Ngoài những gì đã được đề cập.

Cá nhân tôi muốn có một lớp phụ thuộc đăng ký riêng cho mỗi hội đồng. Điều này bổ sung thêm quyền kiểm soát việc sử dụng các lớp ở lớp bên phải và cho phép tạo cho họ internalIMO nào tốt.

Có sử dụng scancơ chế hay không là tùy thuộc vào bạn. Một số khung cung cấp điều này theo mặc định. Lần lượt, nhóm các phụ thuộc tương tự trong một tập hợp các lớp / phương thức, sẽ giúp duy trì việc giải quyết logic ở một nơi nhất quán cho bất kỳ thay đổi nào. Bạn có thể kết hợp cả hai cách tiếp cận.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.