1つ:springAOPとは何ですか?そのアプリケーションシナリオは何ですか?
AOPはIOCやOOPのようなもので、プログラミングのアイデアにすぎません。コンポーネントAutofac、Spring.Net、Castleは、AOPアスペクトプログラミング思考のフレームワークを実装しています。AOPは、実行時に、コードがクラスの指定されたメソッドの指定された位置に動的にカットされることを意味します。これは、アスペクト指向プログラミングのアイデアです。
メソッドに多くの重複コードがあることがわかった場合は、aopを使用してコードを簡略化することを検討できます。たとえば、各メソッドに時間がかかることを監視する場合、従来の方法は各メソッドに監視コードを追加することです。AOPを使用してこの問題を解決する場合は、メソッドの外部で監視コードを記述できます。
AOP思考のアプリケーションシナリオ:
AOPアスペクトキャッシュ
認証認証
エラー処理
デバッグ
ログレコード
パフォーマンスモニタリング
データの永続性
AOPトランザクション
2:AOPアスペクト実行プロセス
AOPアスペクトはインターセプターに少し似ていますが、インターセプターとは少し異なります。
3:コード例
この例の開発環境は.Net Core 3.0を使用し、使用されるAOPフレームワークはAutofacであり、Autofac.Extras.DynamicProxyコンポーネントはNugetを介してインストールされます。
この機能はAOPアスペクトキャッシュであり、毎回データベースをクエリする必要なく、クエリ結果をRedisにキャッシュします。
手順
1.Startupを使用して、Tblog.Blog.AppService.dllの下のすべてのインターフェース実装にBlogCacheAOPアスペクトをカットします。
var servicesDllFile = Path.Combine(basePath, "Titan.Blog.AppService.dll");//获取项目绝对路径
var assemblysServices = Assembly.LoadFile(servicesDllFile);
builder.RegisterAssemblyTypes(assemblysServices)
.AsImplementedInterfaces()
.InstancePerLifetimeScope()
.EnableInterfaceInterceptors()
.InterceptedBy(typeof(BlogCacheAOP));//AOP切面缓存
2.アスペクト共通コード
3.メソッドに特性をマークします。指定された特性を持つメソッドのみが共通コードを実行します
/// <summary>
/// 获取系统中所有的权限
/// </summary>
/// <returns></returns>
[Caching(AbsoluteExpiration = 10)]
public async Task<List<SysRoleModuleButtonDto>> GeRoleModule()
{
var dto = await _iSysRoleModuleButtonRepository.QueryAsNoTracking(x => x.ModuleType == 0);//
var roleModuleButton = dto.MapToList<SysRoleModuleButton, SysRoleModuleButtonDto>();
if (roleModuleButton.Count > 0)
{
foreach (var item in roleModuleButton)
{
item.SysRole = _iSysRoleRepository.QueryBySql($"select * from SysRole where SysRoleId='{item.SysRoleId}' and IsDelete!=1 and RoleStatus=1").Result.FirstOrDefault();
item.SysModule = _iSysModuleRepository.QueryBySql($"select * from SysModule where SysModuleId='{item.SysModuleId}' and ModuleStatus=1 and IsDelete!=1").Result.FirstOrDefault();
}
}
return roleModuleButton;
}
これはAOPアスペクトキャッシュです。その機能は、CachingAttribute機能を含むメソッドの戻り値をRedisにキャッシュすることです。次にこのメソッドにアクセスするときは、最初にキャッシュにアクセスしてクエリします。キャッシュがある場合は、このメソッドをRedisから直接スキップします。以前にキャッシュされた結果セットを取得します。取得されていない場合は、メソッドを実行して戻り値を取得し、Redisにキャッシュします。
このようにして、パフォーマンス監視、ログ監視、AOPトランザクションなど、他の同様の機能を開発することができます。特定のコード実行プロセス(githubアドレスは以下)のためにこのプロジェクトをダウンロードし、上記の例を自分でデバッグして理解してください。
*****注意すべきもう1つの点は、プロジェクトのコントローラーとサービスが分離されていることです。分離がない場合、コントローラーはサービスを直接調整し、AOP登録方法とサービスを変更する必要があります。
1.スタートアップのAOP登録コード
////标记了虚方法virtual的才会进入切面
var assemblysModels = Assembly.Load("Titan.Blog.AppService");
builder.RegisterAssemblyTypes(assemblysModels)
.EnableClassInterceptors()
.InterceptedBy(typeof(BlogCacheAOP));
2.メソッドは仮想を追加する必要があります。そうでない場合、カットを入力できません
/// <summary>
/// 获取系统中所有的权限
/// </summary>
/// <returns></returns>
[Caching(AbsoluteExpiration = 10)]
public virtual async Task<List<SysRoleModuleButtonDto>> GeRoleModule()
{
var dto = await _iSysRoleModuleButtonRepository.QueryAsNoTracking(x => x.ModuleType == 0);//
var roleModuleButton = dto.MapToList<SysRoleModuleButton, SysRoleModuleButtonDto>();
if (roleModuleButton.Count > 0)
{
foreach (var item in roleModuleButton)
{
item.SysRole = _iSysRoleRepository.QueryBySql($"select * from SysRole where SysRoleId='{item.SysRoleId}' and IsDelete!=1 and RoleStatus=1").Result.FirstOrDefault();
item.SysModule = _iSysModuleRepository.QueryBySql($"select * from SysModule where SysModuleId='{item.SysModuleId}' and ModuleStatus=1 and IsDelete!=1").Result.FirstOrDefault();
}
}
return roleModuleButton;
}
3.アスペクトコードを変更する必要はありません
。4 .
AOPアイデアの結論は、実際には元のコードに侵入することなく、ビジネス処理とパブリック処理を分離することです。新しいテクノロジーを学ぶ前に、概念的なことをあまり読まないように感じます。見れば見るほど、新しいテクノロジーを学ぶことに恐れと抵抗を感じるだけです。最初に、新しいテクノロジーで解決できる問題と、実際のアプリケーションシナリオを確認します。これは、新しいテクノロジーの学習に適しています。
ソースコード共有リンク:https://pan.baidu.com/s/1PdE4ZXwobq3dEaUCc0iJgQ抽出コード:uniq