在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. ACR122U读卡器在win7以上系统使用过程中的设置项

    发现ACR122U这个读卡器在进行nested破解的时候总是卡死,换了N个驱动程序都不行. 后发现是windows系统因智能卡的即插即用设置导致的问题,可以通过组策略的设置搞定. gpedit.msc ...

  2. MongoDB系列---集合与文档操作03

    MongoDB-——Collection 学习大纲: 1.集合操作 2.文档操作 知识回顾: 上一篇我们讲述了如何对MongoDB的权限和用户进行日常的基本操作,来达到我们对数据库的基本安全保障. 一 ...

  3. 2019-6-5-WPF-拼音输入法

    原文:2019-6-5-WPF-拼音输入法 title author date CreateTime categories WPF 拼音输入法 lindexi 2019-6-5 17:6:58 +08 ...

  4. EF框架访问access数据库入门(后附官方推荐“驱动”版本)

    vs2017调试通过. 1.添加需要的provider,有点添加驱动的意思.右击项目,NUGET “浏览”,“JetEntityFrameworkProvider”,安装,如图 完成后配置文件(控制台 ...

  5. C# 获取系统硬件可用信息

    如何获取系统可用磁盘和可用内存? 1 获取磁盘信息 这个有自带的 DriveInfo 可以用. DriveInfo 类 (System.IO) | Microsoft Docs 2 获取内存信息 参考 ...

  6. new一个对象的初始化过程

    ############################### 今天总结一下,new对象的初始化过程. ############################### 首先,当不含static成员时, ...

  7. 完美解决linux下vim在终端不能用鼠标复制的问题

    在vim 中输入 :set mouse=r 就行了,还不行的话 :set mouse=v

  8. h5本地存储登录页面实现记住密码功能

    <!DOCTYPE html> <html> <head> <title></title> </head> <style ...

  9. XHR 对象实例所有的配置、属性、方法、回调和不可变值

    当我们声明了一个XMLHttpRequest对象的实例的时候,使用for-in来循环遍历一下这个实例(本文使用的是chrome45版本浏览器),我们会发现在这个实例上绑定了一些内容,我把这些内容进行了 ...

  10. 【Web】解决简书图片不显示问题“系统维护中,图片暂时无法加载”

    简书不显示图片的解决方法 首次编辑于2019-6-6 最近几天在浏览简书上的文章时,发现图片显示不出来,提示"系统维护中,图片暂时无法加载". 猜测应该是简书由于某种原因暂时屏蔽了 ...