(精華)2020年7月2日 ASP.NET Core Castle實現服務注入和AOP(工具版)
實現服務注入和AOP需要安裝如下包
Castle.Core.AsyncInterceptor
public void ConfigureServices(IServiceCollection services)
{
#region 自動注入擁有ITransientDependency,IScopeDependency或ISingletonDependency的類
services.AddFxServices();
#endregion
}
private static readonly ProxyGenerator _generator = new ProxyGenerator();
/// <summary>
/// 自動注入擁有ITransientDependency,IScopeDependency或ISingletonDependency的類
/// </summary>
/// <param name="services">服務集合</param>
/// <returns></returns>
public static IServiceCollection AddFxServices(this IServiceCollection services)
{
Dictionary<Type, ServiceLifetime> lifeTimeMap = new Dictionary<Type, ServiceLifetime>
{
{ typeof(ITransientDependency), ServiceLifetime.Transient},
{ typeof(IScopedDependency),ServiceLifetime.Scoped},
{ typeof(ISingletonDependency),ServiceLifetime.Singleton}
};
//獲取所有解決方案自定義類,aType為程式集所有類
GlobalData.AllFxTypes.ForEach(aType =>
{
//aMap為生命週期介面
lifeTimeMap.ToList().ForEach(aMap =>
{
//ITransientDependency,IScopeDependency或ISingletonDependency
var theDependency = aMap.Key;
//IsAssignableFrom判斷是否相同或是另一個類的超類或介面,不等於aType類,aType不是抽象類,aType是類
if (theDependency.IsAssignableFrom(aType) && theDependency != aType && !aType.IsAbstract && aType.IsClass)
{
//注入實現ServiceDescriptor(服務的型別,用於建立服務實現的新例項的工廠/實現的型別,服務的生存期)的類
services.Add(new ServiceDescriptor(aType, aType, aMap.Value));
//獲取所有解決方案自定義類,aType為程式集所有介面,介面不等於生命週期介面
var interfaces = GlobalData.AllFxTypes.Where(x => x.IsAssignableFrom(aType) && x.IsInterface && x != theDependency).ToList();
//有介面則注入介面
if (interfaces.Count > 0)
{
interfaces.ForEach(aInterface =>
{
//注入AOP
services.Add(new ServiceDescriptor(aInterface, serviceProvider =>
{
CastleInterceptor castleInterceptor = new CastleInterceptor(serviceProvider);
//Castle的動態代理實現服務注入和AOP
return _generator.CreateInterfaceProxyWithTarget(aInterface, serviceProvider.GetService(aType), castleInterceptor);
}, aMap.Value));
});
}
//無介面則注入自己
else
{
services.Add(new ServiceDescriptor(aType, aType, aMap.Value));
}
}
});
});
return services;
}
在服務層中的使用如下:特性必須是繼承BaseAOPAttribute
[DataAddLog(UserLogType.系統使用者管理, "RealName", "使用者")]//操作日誌
[DataRepeatValidate(
new string[] { "UserName" },
new string[] { "使用者名稱" })]//校驗使用者
[Transactional]//多操作提供的事務特性
public async Task AddDataAsync(UserEditInputDTO input)
{
await InsertAsync(_mapper.Map<Base_User>(input));
await SetUserRoleAsync(input.Id, input.RoleIdList);
}
具體的其他相關類請移到類庫中去查詢本人部落格都有
相關文章
- 使用 Castle 實現 AOP,以及 Autofac 整合 CastleAST
- (精華)2020年7月3日 ASP.NET Core AutoMapper實現類的相互對映(工具版)ASP.NETAPP
- 使用MEF與Castle實現AOPAST
- (精華)2020年7月21日 ASP.NET Core 容器偽屬性注入ASP.NET
- (精華)2020年7月1日 ASP.NET Core Swagger的使用(Swashbuckle工具版)ASP.NETSwagger
- 【ASP.NET Core】在 Mini-API 中注入服務ASP.NETAPI
- (精華)2020年7月22日 ASP.NET Core Swagger的使用(NSwag工具版)ASP.NETSwagger
- ASP.NET Core基礎知識(三)【依賴關係注入(服務)】ASP.NET
- (精華)2020年7月1日 ASP.NET Core 解決跨域問題(手寫版)ASP.NET跨域
- (精華)2020年9月17日 ASP.NET Core 中介軟體詳解ASP.NET
- (精華)2020年7月15日 ASP.NET Core EFCore分庫分表框架的使用(手寫版)ASP.NET框架
- (精華)2020年7月1日 ASP.NET Core 使用靜態檔案和目錄瀏覽ASP.NET
- (精華)2020年7月21日 ASP.NET Core 模型驗證過濾器ASP.NET模型過濾器
- .NET Core 服務診斷工具
- .Net Core中依賴注入服務使用總結依賴注入
- (精華)2020年7月1日 ASP.NET Core 使用Enablebuffering多次讀取bodyASP.NET
- 10分鐘 Castle.Windsor 適配 Asp.Net Core 3.0ASTASP.NET
- windows 服務中託管asp.net coreWindowsASP.NET
- asp.net core服務的生命週期ASP.NET
- ASP.NET Core預設容器實現Controller的屬性注入ASP.NETController
- Asp.Net Core&CAP實現分散式事務ASP.NET分散式
- Laravel —— 服務注入實戰案例Laravel
- .NET Core HttpClientFactory+Consul實現服務發現HTTPclient
- (精華)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年6月24日更新)asp.net core3.1實戰篇 RabbitMQ的使用一(安裝Erlang)ASP.NETMQ
- (精華)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依賴注入
- 【視訊】使用ASP.NET Core開發GraphQL服務ASP.NET
- ASP.NET Core中的依賴注入(2):依賴注入(DI)ASP.NET依賴注入
- ASP.NET Core 依賴注入中的ScopeASP.NET依賴注入