(精華)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
- 使用MEF與Castle實現AOPAST
- (精華)2020年7月3日 ASP.NET Core AutoMapper實現類的相互對映(工具版)ASP.NETAPP
- 【ASP.NET Core】在 Mini-API 中注入服務ASP.NETAPI
- (精華)2020年7月22日 ASP.NET Core Swagger的使用(NSwag工具版)ASP.NETSwagger
- (精華)2020年7月1日 ASP.NET Core Swagger的使用(Swashbuckle工具版)ASP.NETSwagger
- (精華)2020年7月21日 ASP.NET Core 容器偽屬性注入ASP.NET
- ASP.NET Core基礎知識(三)【依賴關係注入(服務)】ASP.NET
- Asp.net core依賴注入服務生存期踩坑記錄ASP.NET依賴注入
- ASP.NET Core預設容器實現Controller的屬性注入ASP.NETController
- 10分鐘 Castle.Windsor 適配 Asp.Net Core 3.0ASTASP.NET
- Asp.Net Core&CAP實現分散式事務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依賴注入
- windows 服務中託管asp.net coreWindowsASP.NET
- asp.net core服務的生命週期ASP.NET
- .NET Core HttpClientFactory+Consul實現服務發現HTTPclient
- .NET Core 服務診斷工具
- .Net Core中依賴注入服務使用總結依賴注入
- ASP.NET Core 依賴注入基本用法ASP.NET依賴注入
- ASP.NET Core 中的依賴注入ASP.NET依賴注入
- 幾十行程式碼實現ASP.NET Core自動依賴注入行程ASP.NET依賴注入
- 使用grpcui測試ASP.NET core gRPC服務RPCUIASP.NET
- (精華)2020年7月1日 ASP.NET Core 解決跨域問題(手寫版)ASP.NET跨域
- Laravel —— 服務注入實戰案例Laravel
- ASP.NET WebApi + Autofac 實現依賴注入ASP.NETWebAPI依賴注入
- ASP.NET Core 依賴注入中的ScopeASP.NET依賴注入
- Asp.Net Core使用SignalR進行服務間呼叫ASP.NETSignalR
- 【視訊】使用ASP.NET Core開發GraphQL服務ASP.NET
- ASP.NET Core - JWT認證實現ASP.NETJWT
- .NET Core 3.x 基於AspectCore實現AOP,實現事務、快取攔截器快取
- (精華)2020年7月15日 ASP.NET Core EFCore分庫分表框架的使用(手寫版)ASP.NET框架
- Asp.Net Core入門之自定義服務註冊ASP.NET
- 在 asp.net core 中使用類似 Application 的服務ASP.NETAPP