責任の連鎖は、DIを検出すると

それは3.0に上昇する必要がありますので、学習.NETのコアを共有するための整頓、書かれたブログが、そこはGitHub上のプロジェクトは、ある元々の学習の自分の研究のデモ.NETのコアとして、多くの学生が見て期待していなかった、と星の多くを与えました生徒。

プロジェクト名:Asp.NetCoreExperiment

プロジェクト住所:https://github.com/axzxs2001/Asp.NetCoreExperiment

 

この場合、Githubのコードライブラリ

https://github.com/axzxs2001/Asp.NetCoreExperiment/tree/master/Asp.NetCoreExperiment/Common/DIChainOfResponsibility

ときデューティチェーン、それを行う方法の依存性注入のasp.netコアの経験のデザインモード?

デューティチェーンはFirstTask→SecondTask→ThirdTask→EndTask、次のコードから、リングのセットであります

ParentTaskは親抽象クラスです

 

FirstTaskコード

1     ///  <要約> 
2      /// 第一个任务
 3      ///  </要約> 
4      パブリック クラスFirstTask:ITASK
 5      {
 6          ITASKの_Task。
7          読み取り専用 ILoggerです<FirstTask> _logger。
8          公共 FirstTask(ILoggerです<FirstTask> ロガー、SecondTask secondTask)
 9          {
 10              _logger = ロガー。
11              この.Next(secondTask)。
12          }
 13          // 错误姿势
 14          //公共FirstTask(ILoggerです<FirstTask>ロガー、IEnumerableを<ITASK>タスク)
 15          // {
 16          //     _logger =ロガー。
17          //     foreachの(タスクでVARタスク)
 18          //     {
 19          //         (タスクがSecondTaskある)場合
 20          //         {
 21          //             this.Next(タスク)。
22          //         }
 23          //     }
 24          // } 
25  
26          ///  <要約> 
27          /// 传送下一个方法
 28          ///  </要約> 
29         ///  <PARAM NAME = "parentTask"> </ PARAM> 
30          公共 ボイド次に(ITASKタスク)
 31          {
 32              Console.WriteLineを($ " ------------- {task.GetType( ).NAME} .Next()" )。
33              = _Task タスク。
34          }
 35          ///  <要約> 
36          /// 职责链任务方法
 37          ///  </要約> 
38          ///  ます。<param name = "taskParmeter"> 任务内容</ PARAM> 
39          ///  <戻ります> </リターン> 
40          公共 BOOLExecuteTask(TaskParmeter taskParmeter)
 41          {
 42              VARの結果= SelfTask(taskParmeter)。
43              リターン _task.ExecuteTask(taskParmeter)&& 結果。
44          }
 45          ブールSelfTask(TaskParmeter taskParmeter)
 46          {
 47              _logger.LogInformation(" --------------------------------- ---------- FirstTask " );
48              リターン 49          }
 50 }

FirstTaskがSecondTask、ThirdTaskへの共感SecondTaskリンクにリンクされている、EndTask、EndTaskへThirdTaskリンクは最終的に、他のタスクにリンクする必要はありませんされて

1      ///  <まとめ> 
2      /// 最終タスク
 3。     ///  </要約> 
4。     パブリック クラスEndTask:ITASK
 。5      {       
 6          読み取り専用 ILoggerです<EndTask> _logger;
 7          公共 EndTask(ILoggerです<EndTask> ロガー)
 。8          {
 9              _logger = ロガー;
 10          }
 11    
12である         ///  <まとめ> 
13である         /// デューティチェーン方法タスク
 14          ///  </要約> 
15          ///  <PARAM NAME = "taskParmeter">任务内容</ PARAM> 
16          ///  <戻る> </戻る> 
17          公共 ブールExecuteTask(TaskParmeter taskParmeter)
 18          {
 19              _logger.LogInformation(" ----------------- -------------------------- EndTask " );
20              リターン 21          }
 22 }

注射のコンストラクタ内の各タスクのタスク依存性発生、終了EndTaskタスクは、それが必要なタスクダウン伝達チェーンではありません

スタートアップでは、注入は責任の下、実際には、タスクの正確な種類を見つけることができませんそれぞれのタスクを試しコンストラクタで間違った姿勢コードにコメント内のコードを使用して、エンティティクラスでなければなりません。

1          公共 ボイドConfigureServices(IServiceCollectionサービス)
 2          {
 3              // 职责链依赖注入
4              services.AddScoped <EndTask> ();
5              services.AddScoped <ThirdTask> ();
6              services.AddScoped <SecondTask> ();
7              services.AddScoped <FirstTask> ();
8  
9              // 错误姿势
 10              // services.AddScoped <ITASK、EndTask>();
11              // services.AddScoped <ITASK、ThirdTask>();
12              // services.AddScoped <ITASK、SecondTask>();
13              // services.AddScoped <ITASK、FirstTask>(); 
14         }

最初のタスクからValuesControllerノートに

1つの   パブリック クラスValuesController:ControllerBase
 2      {
 3          ///  <要約> 
4          /// 第一个任务
 5          ///  </要約> 
6          読み取り専用ITASKの_Task。
7  
8          公共ValuesController(FirstTask firstTask)
 9          {
 10              _Task = firstTask。
11          }
 12          // 错误姿势
 13          // パブリックValuesController(IEnumerableを<ITASK>タスク)
 14          // {
 15          //    foreachの(タスクでVARタスク)
 16          //     {
 17          //         場合(タスクがEndTaskある)
 18          //         {
 19          //             _Task =タスク。
20          //         }
 21          //     }
 22          // } 
23  
24          [HTTPGET]
 25          公共のActionResult <のIEnumerable < ストリング >> 取得()
 26          {
 27              // 调用第一个任务
28              _task.ExecuteTask(新しい TaskParmeter(){タスクID = 1 })。
29       
30              リターン 新しい 文字列 [] { " 値1 "" 値2 " }。
31          }
 32 }

 

おすすめ

転載: www.cnblogs.com/axzxs2001/p/11702738.html