当职责链遇到DI
在GitHub上有个项目,本来是作为自己研究学习.net core的Demo,没想到很多同学在看,还给了很多星,所以觉得应该升成3.0,整理一下,写成博分享给学习.net core的同学们。
项目名称:Asp.NetCoreExperiment
项目地址:https://github.com/axzxs2001/Asp.NetCoreExperiment
本案例Github代码库
https://github.com/axzxs2001/Asp.NetCoreExperiment/tree/master/Asp.NetCoreExperiment/Common/DIChainOfResponsibility
当设计模式中的职责链模式,遇到asp.net core的依赖注入该怎么做呢?
职责链模式是一环套一环,从FirstTask→SecondTask→ThirdTask→EndTask,代码如下
ParentTask是一个父抽象类
FirstTask代码
1 ///2 /// 第一个任务 3 /// 4 public class FirstTask : ITask 5 { 6 ITask _task; 7 readonly ILogger _logger; 8 public FirstTask(ILogger logger, SecondTask secondTask) 9 { 10 _logger = logger; 11 this.Next(secondTask); 12 } 13 //错误姿势 14 //public FirstTask(ILogger logger, IEnumerable 15 //{ 16 // _logger = logger; 17 // foreach (var task in tasks) 18 // { 19 // if (task is SecondTask) 20 // { 21 // this.Next(task); 22 // } 23 // } 24 //} 25 26 ///tasks) 27 /// 传送下一个方法 28 /// 29 /// 30 public void Next(ITask task) 31 { 32 Console.WriteLine($"-------------{task.GetType().Name}.Next()"); 33 _task = task; 34 } 35 /// 36 /// 职责链任务方法 37 /// 38 /// 任务内容 39 /// 40 public bool ExecuteTask(TaskParmeter taskParmeter) 41 { 42 var result = SelfTask(taskParmeter); 43 return _task.ExecuteTask(taskParmeter) && result; 44 } 45 bool SelfTask(TaskParmeter taskParmeter) 46 { 47 _logger.LogInformation("-------------------------------------------FirstTask"); 48 return true; 49 } 50 }
FirstTask中是链接到SecondTask,同理SecondTask链接到ThirdTask,ThirdTask链接到EndTask,EndTask是个终于,不需要链接到其他任务了
1 ///2 /// 最后的任务 3 /// 4 public class EndTask : ITask 5 { 6 readonly ILogger _logger; 7 public EndTask(ILogger logger) 8 { 9 _logger = logger; 10 } 11 12 /// 13 /// 职责链任务方法 14 /// 15 /// 任务内容 16 /// 17 public bool ExecuteTask(TaskParmeter taskParmeter) 18 { 19 _logger.LogInformation("-------------------------------------------EndTask"); 20 return true; 21 } 22 }
依赖注入发生在每个任务的构造函数中的Task,EndTask是结束任务,所以不需要往下传递链任务
在StartUp中,注入必需是实体类,负责在每个任务的构造函数中找不到下一个准确的任务类型,其实可以使用代码中注释为错误姿势的代码试一下。
1 public void ConfigureServices(IServiceCollection services) 2 { 3 //职责链依赖注入 4 services.AddScoped(); 5 services.AddScoped (); 6 services.AddScoped (); 7 services.AddScoped (); 8 9 //错误姿势 10 //services.AddScoped (); 11 //services.AddScoped(); 12 //services.AddScoped(); 13 //services.AddScoped(); 14 }
在ValuesController中调起第一个任务
1 public class ValuesController : ControllerBase 2 { 3 ///4 /// 第一个任务 5 /// 6 readonly ITask _task; 7 8 public ValuesController(FirstTask firstTask) 9 { 10 _task = firstTask; 11 } 12 //错误姿势 13 //public ValuesController(IEnumerable tasks) 14 //{ 15 // foreach (var task in tasks) 16 // { 17 // if (task is EndTask) 18 // { 19 // _task = task; 20 // } 21 // } 22 //} 23 24 [HttpGet] 25 public ActionResultstring>> Get() 26 { 27 //调用第一个任务 28 _task.ExecuteTask(new TaskParmeter() { TaskID = 1 }); 29 30 return new string[] { "value1", "value2" }; 31 } 32 }