在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. JdbcTemplate经典案例

    一.JdbcTemplate案例配置式 (1)导入依赖 <dependency> <groupId>org.springframework</groupId> &l ...

  2. Vs Code 2019软件安装教程及常用的入门设置

    小编认为VsCode是一款非常好用的编辑器,插件丰富,支持的语言种类非常多.我所使用VsCode主要打一些前端的代码,自己感觉very good. 点击运行. 按图所示操作. 安装教程很简单的,主要是 ...

  3. IT兄弟连 Java语法教程 流程控制语句 经典案例

    使用continue忽略本次循环剩下的语句 continue的功能和break有点类似,区别是continue只是忽略本次循环剩下的语句,接着开始下一次循环,并不会终止循环:而break则是完全终止循 ...

  4. gitlab与jenkins结合构建持续集成

    Jenkins是java编写,需要安装JDK,这里采用 yum 安装,对版本有需求的,可以到 oracle 官网下载 JDK. yum install -y java-1.8.0-openjdk 一. ...

  5. springboot热启动中那些不为人知的东东

    在springboot热启动中,大家都知道在pom文件中配置devtools,但是当这个服务特别大,或者引入的包特别多的时候,重启一下就特别慢,如果开发的PC的内存和cpu如果不给里的h话,系统就卡主 ...

  6. [IDA] 将连续的单个变量值修改为结构体

    直接选中最上边的结构体,使用ALT+Q来进行修改.

  7. C#数组2(多维数组)

    using System; namespace ConsoleApp3 { struct WuGong { public string Name; public int Attack; } class ...

  8. WPF线段式布局的一种实现

    线段式布局 有时候需要实现下面类型的布局方案,不知道有没有约定俗成的称呼,我个人强名为线段式布局.因为元素恰好放置在线段的端点上. 实现 WPF所有布局控件都直接或间接的继承自System.Windo ...

  9. Java正则表达式详细解析

    元字符 正则表达式使用一些特定的元字符来检索.匹配和替换符合规则的字符串 元字符:普通字符.标准字符.限定字符(量词).定位字符(边界字符) 正则表达式引擎 正则表达式是一个用正则符号写出来的公式 程 ...

  10. 在执行方法和Web资源中获取传递过来参数的值

    关注本人微信和易信公众号: 微软动态CRM专家罗勇 ,回复228或者20161026可方便获取本文,同时可以在第一间得到我发布的最新的博文信息,follow me!我的网站是 www.luoyong. ...