(精華)2020年7月21日 ASP.NET Core 容器偽屬性注入
為 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;
}
註冊測試服務
相關文章
- ASP.NET Core預設容器實現Controller的屬性注入ASP.NETController
- (精華)2020年7月2日 ASP.NET Core Castle實現服務注入和AOP(工具版)ASP.NETAST
- Asp.net core自定義依賴注入容器,替換自帶容器ASP.NET依賴注入
- (精華)2020年9月17日 ASP.NET Core 中介軟體詳解ASP.NET
- spring原始碼解析之IOC容器(四)——屬性注入Spring原始碼
- (精華)2020年7月21日 ASP.NET Core 模型驗證過濾器ASP.NET模型過濾器
- (精華)2020年7月1日 ASP.NET Core 使用Enablebuffering多次讀取bodyASP.NET
- Spring IOC容器【p名稱空間注入屬性值 】Spring
- (精華)2020年7月1日 ASP.NET Core Swagger的使用(Swashbuckle工具版)ASP.NETSwagger
- (精華)2020年7月20日 ASP.NET Core serilog日誌框架的使用ASP.NET框架
- ASP.NET Core依賴注入(DI)ASP.NET依賴注入
- ASP.NET Core 依賴注入(DI)ASP.NET依賴注入
- ASP.NET Core - 依賴注入(二)ASP.NET依賴注入
- ASP.NET Core - 依賴注入(一)ASP.NET依賴注入
- ASP.NET Core - 依賴注入(三)ASP.NET依賴注入
- ASP.NET Core - 依賴注入(四)ASP.NET依賴注入
- (精華)2020年7月1日 ASP.NET Core 解決跨域問題(手寫版)ASP.NET跨域
- (精華)2020年7月22日 ASP.NET Core Swagger的使用(NSwag工具版)ASP.NETSwagger
- (精華)2020年7月20日 ASP.NET Core log4.net日誌框架的使用ASP.NET框架
- ASP.NET Core 依賴注入基本用法ASP.NET依賴注入
- [譯]ASP.NET Core 2.0 依賴注入ASP.NET依賴注入
- ASP.NET Core 中的依賴注入ASP.NET依賴注入
- (精華)2020年7月1日 ASP.NET Core 使用靜態檔案和目錄瀏覽ASP.NET
- Asp.Net Core Blazor之容器部署ASP.NETBlazor
- (精華)2020年7月15日 ASP.NET Core EFCore分庫分表框架的使用(手寫版)ASP.NET框架
- ASP.NET Core中的依賴注入(2):依賴注入(DI)ASP.NET依賴注入
- (精華2020年5月4日更新) vue教程篇 計算屬性computed的使用Vue
- ASP.NET Core 依賴注入中的ScopeASP.NET依賴注入
- 基於autofac的屬性注入
- Flex彈性盒子與容器屬性Flex
- (精華)2020年7月3日 ASP.NET Core AutoMapper實現類的相互對映(工具版)ASP.NETAPP
- (精華)2020年9月2日 .NET Core 命令列的基本使用命令列
- ASP.NET Core依賴注入初識與思考ASP.NET依賴注入
- (精華2020年6月24日更新)asp.net core3.1實戰篇 RabbitMQ的使用一(安裝Erlang)ASP.NETMQ
- Spring原始碼系列:依賴注入(三)-屬性注入Spring原始碼依賴注入
- ASP.NET CausesValidation 屬性ASP.NET
- 【ASP.NET Core】在 Mini-API 中注入服務ASP.NETAPI
- Docker & ASP.NET Core (4):容器間的連線DockerASP.NET