(精華)2020年7月21日 ASP.NET Core 容器偽屬性注入

愚公搬程式碼發表於2020-07-21

為 Controller 實現偽屬性注入

Controller 預設是不會通過自帶容器來 Resolve&Activate 的,是通過MVC自身管理的。可以通過呼叫 AddControllersAsServices()方法來讓 Controller 使用自帶容器。

services.AddControllers().AddControllersAsServices();

AddControllersAsServices原始碼如下
在這裡插入圖片描述
定義 Controller 基類
在這裡插入圖片描述
Controller 繼承基類
在這裡插入圖片描述
改造 Controller 啟用器
在這裡插入圖片描述
替換預設 Controller 啟用器

services.AddControllers().AddControllersAsServices();
services.Replace(ServiceDescriptor.Transient<IControllerActivator, XcServiceBasedControllerActivator>()); //替換預設 Controller 啟用器

在這裡插入圖片描述

為 Application Service 實現偽屬性注入

只是以 Application Service 來作為講解,同理可舉一反三到其他地方。Application Service 屬於領域驅動分層架構中的一層,如不瞭解,可自行查詢資料。

定義應用服務基類介面

public interface IAppService
{
    ILogger Logger { get; set; }
}

public class AppService:IAppService
{
    public ILogger Logger { get; set; }
}

定義具體服務,以 User 服務為例

public interface IUserAppService:IAppService
{
    void Create();
}

public class UserAppService : AppService,IUserAppService
{
    public void Create()
    {
        Logger.LogInformation("來自 Application Service 的日誌");
    }
}

定義特殊的註冊服務的方法,以便實現 Resolve 為 Logger 賦值

public static class ServiceExtensions
{
    public static IServiceCollection AddApplicationService<TService, TImpl>(this IServiceCollection services) where TService:IAppService where TImpl:AppService
    {
        services.AddApplicationService(typeof(TService), typeof(TImpl));
        return services;
    }
    // 可以反射程式集呼叫此方法實現批量自動註冊應用服務
    public static IServiceCollection AddApplicationService(this IServiceCollection services, Type serviceType,Type implType)
    {
        services.AddTransient(serviceType, sp =>
        {
            //獲取服務實現的例項
            var implInstance = ActivatorUtilities.CreateInstance(sp, implType); ;

            if (implInstance is AppService obj)
            {
                //為 Logger 賦值
                obj.Logger= sp.GetRequiredService<ILoggerFactory>().CreateLogger(implType);
            }
            
            return implInstance;
        });
        return services;
    }

註冊測試服務
在這裡插入圖片描述
在這裡插入圖片描述

相關文章