在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代码

    /// <summary>
/// 第一个任务
/// </summary>
public class FirstTask : ITask
{
ITask _task;
readonly ILogger<FirstTask> _logger;
public FirstTask(ILogger<FirstTask> logger, SecondTask secondTask)
{
_logger = logger;
this.Next(secondTask);
}
//错误姿势
//public FirstTask(ILogger<FirstTask> logger, IEnumerable<ITask> tasks)
//{
// _logger = logger;
// foreach (var task in tasks)
// {
// if (task is SecondTask)
// {
// this.Next(task);
// }
// }
//} /// <summary>
/// 传送下一个方法
/// </summary>
/// <param name="parentTask"></param>
public void Next(ITask task)
{
Console.WriteLine($"-------------{task.GetType().Name}.Next()");
_task = task;
}
/// <summary>
/// 职责链任务方法
/// </summary>
/// <param name="taskParmeter">任务内容</param>
/// <returns></returns>
public bool ExecuteTask(TaskParmeter taskParmeter)
{
var result = SelfTask(taskParmeter);
return _task.ExecuteTask(taskParmeter) && result;
}
bool SelfTask(TaskParmeter taskParmeter)
{
_logger.LogInformation("-------------------------------------------FirstTask");
return true;
}
}

FirstTask中是链接到SecondTask,同理SecondTask链接到ThirdTask,ThirdTask链接到EndTask,EndTask是个终于,不需要链接到其他任务了

     /// <summary>
/// 最后的任务
/// </summary>
public class EndTask : ITask
{
readonly ILogger<EndTask> _logger;
public EndTask(ILogger<EndTask> logger)
{
_logger = logger;
} /// <summary>
/// 职责链任务方法
/// </summary>
/// <param name="taskParmeter">任务内容</param>
/// <returns></returns>
public bool ExecuteTask(TaskParmeter taskParmeter)
{
_logger.LogInformation("-------------------------------------------EndTask");
return true;
}
}

依赖注入发生在每个任务的构造函数中的Task,EndTask是结束任务,所以不需要往下传递链任务

在StartUp中,注入必需是实体类,负责在每个任务的构造函数中找不到下一个准确的任务类型,其实可以使用代码中注释为错误姿势的代码试一下。

         public void ConfigureServices(IServiceCollection services)
{
//职责链依赖注入
services.AddScoped<EndTask>();
services.AddScoped<ThirdTask>();
services.AddScoped<SecondTask>();
services.AddScoped<FirstTask>(); //错误姿势
//services.AddScoped<ITask,EndTask>();
//services.AddScoped<ITask, ThirdTask>();
//services.AddScoped<ITask, SecondTask>();
//services.AddScoped<ITask, FirstTask>();
}

在ValuesController中调起第一个任务

   public class ValuesController : ControllerBase
{
/// <summary>
/// 第一个任务
/// </summary>
readonly ITask _task; public ValuesController(FirstTask firstTask)
{
_task = firstTask;
}
//错误姿势
//public ValuesController(IEnumerable<ITask> tasks)
//{
// foreach (var task in tasks)
// {
// if (task is EndTask)
// {
// _task = task;
// }
// }
//} [HttpGet]
public ActionResult<IEnumerable<string>> Get()
{
//调用第一个任务
_task.ExecuteTask(new TaskParmeter() { TaskID = }); return new string[] { "value1", "value2" };
}
}

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

  1. JavaScript之职责链模式

    一.概述 职责链模式(Chain of responsibility),就是使多个对象都有机会处理请求,从而避免请求的发送者和接受者之间的耦合关系.将这个对象连成一条链,并沿着这条链传递该请求,直到有 ...

  2. 设计模式(十三) 职责链(chain of responsibility)

    软件领域中的设计模式为开发人员提供了一种使用专家设计经验的有效途径.设计模式中运用了面向对象编程语言的重要特性:封装.继承.多态,真正领悟设计模式的精髓是可能一个漫长的过程,需要大量实践经验的积累.最 ...

  3. C#设计模式之职责链

    Iron之职责链 需求: "Iron"的建造一直没有停止,现在单个部件是有的,但是在部件从工厂里出来的时候,在组装到一起之前,我们还是非常有必要对部件进行质量检测,或者是其它个方面 ...

  4. C#设计模式系列:职责链模式(Chain of Responsibility)

    1.职责链模式简介 1.1>.定义 职责链模式是一种行为模式,为解除请求的发送者和接收者之间的耦合,而使多个对象都有机会处理这个请求.将这些对象连接成一条链,并沿着这条链传递该请求,直到有一个对 ...

  5. javascript设计模式实践之职责链--具有百叶窗切换图片效果的JQuery插件(三)

    在上一篇<javascript设计模式实践之模板方法--具有百叶窗切换图片效果的JQuery插件(二)>里,通过采用模板方法模式完成了切换效果对象的构建编写. 接下来就是完成各效果对象的调 ...

  6. php实现设计模式之 职责链模式

    <?php /** * 职责链模式 * * 为解除请求的发送者和接收者之间的耦合,而使用多个对象都用机会处理这个请求,将这些对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它 * 抽象 ...

  7. Filter体现职责链模式

    1. 前言 Filter—Filter 技术是servlet2.3 新增加的功能.完成的流程:对用户请求进行预处理,接着将请求交给Servlet进行处理并生成响应,最后Filter再对服务器响应进行后 ...

  8. Js 职责链模式 简单理解

    js 职责链模式 的简单理解.大叔的代码太高深了,不好理解. function Handler(s) { this.successor = s || null; this.handle = funct ...

  9. JAVA 设计模式 职责链模式

    用途 职责链模式 (Chain Of Responsibility) 使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系. 将这个对象连成一条链,并沿着这条链传递该请求,直到有一个 ...

随机推荐

  1. IT兄弟连 HTML5教程 HTML文件的主体结构

    每个页面都是一个独立的HTML文档,每个HTML文档的主体结构又都是相同的,而且在一个文档中这样的主体结构只能声明一次.可以简单的将HTML文档主体结构分为两部分,一部分是定义文档类型,HTML5中声 ...

  2. IT兄弟连 Java语法教程 数组 什么是数组

    数组是编程语言中最常见的一种数据结构,可用于存储多个数据,每个数组元素存放一个数据,通常可通过数组元素的索引来访问数组元素,包括为数组元素赋值和取出数组元素的值.Java语言的数组则具有其特有的特征, ...

  3. 【学习笔记】动态规划—各种 DP 优化

    [学习笔记]动态规划-各种 DP 优化 [大前言] 个人认为贪心,\(dp\) 是最难的,每次遇到题完全不知道该怎么办,看了题解后又瞬间恍然大悟(TAT).这篇文章也是花了我差不多一个月时间才全部完成 ...

  4. Java开发桌面程序学习(一)——JavaFx+Jfoenix初始以及搭建

    Java开发桌面程序学习(一)--JavaFx+Jfoenix初始以及搭建 前言 想做一个Java的桌面程序,但是,使用原生的Swing感觉又十分麻烦,那个布局都是拿代码设置,看着十分的乱,偶然的情况 ...

  5. .net post请求wcf

    class Program { static void Main(string[] args) { }); var r = HttpHelper.PostRequest("http://lo ...

  6. python处理oracle数据库的返回数据

    上代码: import SqlHelper.ORACLE as ORA import pandas as pd if __name__ == '__main__': #连接数据库 ms = ORA.O ...

  7. go-百度贴吧-纵向爬取

    百度贴吧纵向爬取 上一个是横向爬取的,这个纵向爬取,具体怎么做的看代码 package main import ( "fmt" "io" "net/h ...

  8. JavaScript初探 三 (学习js数组)

    JavaScript初探 (三) JavaScript数组 定义 创建数组 var 数组名 = [元素0,元素1,元素2,--] ; var arr = ["Huawei",&qu ...

  9. git设置github的远程仓库的相关操作

        git能够把github作为远程仓库,本地可以进行推送有关变更,从而多人可以进行协作开发工作.    1  ssh-keygen -t rsa -C "your-email@163. ...

  10. Hystrix工作流

    Hystrix工作流程图: 流程图详解 1. 构造HystrixCommand对象或者HystrixObservableCommand对象 构造HystrixCommand 或HystrixObser ...