当职责链遇到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    /// <summary>
 2     /// 第一个任务
 3     /// </summary>
 4     public class FirstTask : ITask
 5     {
 6         ITask _task;
 7         readonly ILogger<FirstTask> _logger;
 8         public FirstTask(ILogger<FirstTask> logger, SecondTask secondTask)
 9         {
10             _logger = logger;
11             this.Next(secondTask);
12         }
13         //错误姿势
14         //public FirstTask(ILogger<FirstTask> logger, IEnumerable<ITask> tasks)
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         /// <summary>
27         /// 传送下一个方法
28         /// </summary>
29         /// <param name="parentTask"></param>
30         public void Next(ITask task)
31         {
32             Console.WriteLine($"-------------{task.GetType().Name}.Next()");
33             _task = task;
34         }
35         /// <summary>
36         /// 职责链任务方法
37         /// </summary>
38         /// <param name="taskParmeter">任务内容</param>
39         /// <returns></returns>
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     /// <summary>
 2     /// 最后的任务
 3     /// </summary>
 4     public class EndTask : ITask
 5     {
 6         readonly ILogger<EndTask> _logger;
 7         public EndTask(ILogger<EndTask> logger)
 8         {
 9             _logger = logger;
10         }
11
12         /// <summary>
13         /// 职责链任务方法
14         /// </summary>
15         /// <param name="taskParmeter">任务内容</param>
16         /// <returns></returns>
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<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   public class ValuesController : ControllerBase
 2     {
 3         /// <summary>
 4         /// 第一个任务
 5         /// </summary>
 6         readonly ITask _task;
 7
 8         public ValuesController(FirstTask firstTask)
 9         {
10             _task = firstTask;
11         }
12         //错误姿势
13         //public ValuesController(IEnumerable<ITask> 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 ActionResult<IEnumerable<string>> Get()
26         {
27             //调用第一个任务
28             _task.ExecuteTask(new TaskParmeter() { TaskID = 1 });
29
30             return new string[] { "value1", "value2" };
31         }
32 }

原文地址:https://www.cnblogs.com/axzxs2001/p/11702738.html

时间: 2024-10-19 07:22:56

当职责链遇到DI的相关文章

职责链模式分析、结构图与基本代码

?? 定义:使多个对象都有机会处理请求.从而避免请求的发送者和接收者之间的耦合关系.将这个对象连成一条链.并沿着这条链传递该请求,直到有一个对象处理它为止. 优点:当客户提交一个请求时,请求时沿链传递直至有一个ConcreteHandler对象负责处理它.这就使得接收者和发送者都没有对方的明白信息,且链中的对象自己也并不知道链的结构. 结果是职责链可简化对象的相互连接,它们仅需保持一个指向其后继者的引用,而不需保持它全部的候选接收者的引用.这就大大减少了耦合度了.因为式在client来定义链的结

[设计模式]&lt;6&gt;. C++与职责链模式(chain of rsponsibility pattern)

默默地EEer,原文地址: http://www.cnblogs.com/hebaichuanyeah/p/5625233.html 职责链模式指使多个对象多有机会处理请求,避免请求发送者和接受者的耦合关系. 将这些接受处理的对象连成一条链,并沿着该链处理请求. 一个传说中的应用情景: 假如去政府部门办事,遇到了打字员小丽,在打LOL的小张以及主任老李,互相踢皮球推脱. #include <iostream> using namespace std; class Handler { prote

职责链模式

1.职责链模式:使多个对象都有机会处理请求,从而避免请求的发送者和接受者的耦合关系.将这个对象连成一条链,并沿着这条链传递该请求,指导有一个对象处理它为止. 2.优点:(1).当客户提交一个申请时,请求是沿链传递直至有一个对象负责处理它位置.在客户端根本不需要知道是谁做的处理.(2).简化对象的相互连接,它们仅需要保持一个指向其后继者的引用,而不需要保持它所有的候选接受者的引用.(3).可以随时增加或者修改处理一个请求的结构.增强了给对象纸牌职责的灵活性. 3.注意:一个请求极有可能到链的末端都

设计模式之行为型模式—— 3.5 职责链模式

<?php /**  * 3.5 职责链模式  *  定义:  *  使多个对象都有机会处理请求,从而避免请求的  *  发送者和接受者直接的耦合关系.将这个对象连  *  成一条链,并沿着这条链传递该请求,直到有一  *  个对象处理它为止.  *  角色:  *  1. 抽象Handler类  *  职责:定义一个处理请示的接口.  *  2. 具体Handler类  *  职责:具体处理者类,处理它所负责的请求  *    ,它可访问它的后继者,如果可处理  *    该请求,就处理之,否

大话设计模式C++实现-第24章-职责链模式

一.UML图 二.概念 职责链模式(Chain Of Responsibility):使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合.将这个对象连成一条链,并沿着这条链传递该请求,知道有一个对象处理它为止. 三.说明  角色: (1)Handler类:定义一个处理请求的接口. (2)ConcreteHandler类:具体的处理请求的接口. 职责链模式的好处: (1)最关键的是,当客户提交一个请求时,请求时沿链传递直至有一个ConcreteHandler对象负责处理它. (2)

职责链模式——机房收费系统下机结账

在机房收费系统中,学生下机结账最让人头疼了.因为学生的消费时间(下机时间-上机时间-上机准备时间)有三种情况: 1.消费时间<=0,也就是下机时间与上机时间的间隔在上机准备时间范围内,这种情况是不收费的. 2.消费时间<=最少上机时间,这种情况下消费时间按照最少上机时间收费. 3.消费时间>最少上机时间,这种情况还要考虑递增单位时间.比如递增单位时间是10分钟,消费时间是42分 钟,42/10=4.....2,这种情况要按照50分钟收费. 以上消费时间就分了三种情况,更复杂的是第二种和第

职责链模式Chain of Responsibility

1.简介 1)模式概述:使多个对象都有机会处理请求,从而避免请求的发送者和接受者之间的耦合关系.将这个对象连成一条链,并沿着这条链传递该请求,知道有一个对象处理它位置. 2)核心: 2.UML与代码实现 1)结构:UML 模式组成: 抽象处理者角色(Handler:Approver):定义一个处理请求的接口,和一个后继连接(可选) 具体处理者角色(ConcreteHandler:President):处理它所负责的请求,可以访问后继者,如果可以处理请求则处理,否则将该请求转给他的后继者. 客户类

VB.NET &amp; 职责链模式

前几天一直在讲设计模式,在和师哥师姐的讨论过程中,发现能在机房收费个人重构版中用到好几个设计模式,首先来讨论讨论职责链模式: 首先当看见这个模式的第一眼就觉得这是一个很简单的模式,可是当使用起来真的得考虑许多,首先要明白什么是链?链是一系列节点的集合,可以灵活拆分再重组.这也是与 链表不同的地方,用户可以去访问节点中的任何一点作为开始节点. 定义: 使多个对象都有机会处理请求,从而避免请求的发送者和接受者之间的耦合关系.将这个对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理他为止. 举

学习日记之职责链模式和Effective C++

职责链模式(Chain of Responsibility):使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系.将这个对象连成一条链,并沿着该条链传递该请求,直到有一个对象处理它为止. (1),当客户提交一个请求时,请求时沿着链传递直到有一个 ConcreteHandler 对象负责处理它. (2),接收者和发送者都没有对方的明确信息,切链中的对象自己也不知道链的结构.结果是职责链可简化为对象之间的连接,它们仅需保留一个指向其后继者的引用.而不惜保留它所有的候选接收者的引用