当职责链遇到DI
在GitHub上有个项目,本来是作为自己研究学习.net core的Demo,没想到很多同学在看,还给了很多星,所以觉得应该升成3.0,整理一下,写成博分享给学习.net core的同学们。
项目名称:Asp.NetCoreExperiment
项目地址:https://github.com/axzxs2001/Asp.NetCoreExperiment
本案例Github代码库
当设计模式中的职责链模式,遇到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的更多相关文章
- JavaScript之职责链模式
一.概述 职责链模式(Chain of responsibility),就是使多个对象都有机会处理请求,从而避免请求的发送者和接受者之间的耦合关系.将这个对象连成一条链,并沿着这条链传递该请求,直到有 ...
- 设计模式(十三) 职责链(chain of responsibility)
软件领域中的设计模式为开发人员提供了一种使用专家设计经验的有效途径.设计模式中运用了面向对象编程语言的重要特性:封装.继承.多态,真正领悟设计模式的精髓是可能一个漫长的过程,需要大量实践经验的积累.最 ...
- C#设计模式之职责链
Iron之职责链 需求: "Iron"的建造一直没有停止,现在单个部件是有的,但是在部件从工厂里出来的时候,在组装到一起之前,我们还是非常有必要对部件进行质量检测,或者是其它个方面 ...
- C#设计模式系列:职责链模式(Chain of Responsibility)
1.职责链模式简介 1.1>.定义 职责链模式是一种行为模式,为解除请求的发送者和接收者之间的耦合,而使多个对象都有机会处理这个请求.将这些对象连接成一条链,并沿着这条链传递该请求,直到有一个对 ...
- javascript设计模式实践之职责链--具有百叶窗切换图片效果的JQuery插件(三)
在上一篇<javascript设计模式实践之模板方法--具有百叶窗切换图片效果的JQuery插件(二)>里,通过采用模板方法模式完成了切换效果对象的构建编写. 接下来就是完成各效果对象的调 ...
- php实现设计模式之 职责链模式
<?php /** * 职责链模式 * * 为解除请求的发送者和接收者之间的耦合,而使用多个对象都用机会处理这个请求,将这些对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它 * 抽象 ...
- Filter体现职责链模式
1. 前言 Filter—Filter 技术是servlet2.3 新增加的功能.完成的流程:对用户请求进行预处理,接着将请求交给Servlet进行处理并生成响应,最后Filter再对服务器响应进行后 ...
- Js 职责链模式 简单理解
js 职责链模式 的简单理解.大叔的代码太高深了,不好理解. function Handler(s) { this.successor = s || null; this.handle = funct ...
- JAVA 设计模式 职责链模式
用途 职责链模式 (Chain Of Responsibility) 使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系. 将这个对象连成一条链,并沿着这条链传递该请求,直到有一个 ...
随机推荐
- git 添加add readme.txt 报fatal: pathspec 'readme.txt' did not match any files错误
刚刚接触git版本管理器,跟着廖雪峰老师的git教程学习,在创建一个新的文件时,使用的是$ git add readme.txt指令,但是报出fatal: pathspec 'readme.txt' ...
- springboot mail整合freemark实现动态生成模板
目标:1:springboot 整合 mail2: mail 使用freemark 实现模板动态生成(就是通过字符串生成模板,不需要在工程中写入固定模板)3: springboot 整合aop 实现日 ...
- Knative 实战:一个微服务应用的部署
作者 | 元毅 阿里云智能事业群高级开发工程师 在 Istio 中提供了一个 Bookinfo 的示例,用于演示微服务之间的调用,那么如何在 Knative 中部署这个示例呢?本文将会给大家介绍一下在 ...
- OpenGL入门1.7:摄像机
每一个小步骤的源码都放在了Github 的内容为插入注释,可以先跳过 前言 我们已经知道了何为观察矩阵以及如何使用观察矩阵移动场景(我们向后移动了一点) OpenGL本身没有摄像机(Camera)的概 ...
- 将Docker容器转移至另一服务器
1 把当前的容器提交为一个镜像: docker commit 容器名 镜像名 2 将镜像存为tar文件 docker save 镜像名 >备份文件.tar 3将 备份文件.tar 复制到目的主机 ...
- mysql操作数据表
目录 创建数据表 列约束 查看数据表结构 列类型(字段类型) 整型 浮点型 字符串 时间日期类型 Date Time Datetime Timestamp Year 枚举enum 修改表名 增加字段 ...
- [PHP] PDO对象与mysql的连接超时
在php中每一个new的PDO对象,都会去连接mysql,都会创建一条tcp连接.当pdo对象赋予的变量是一个的时候,那么他只会保持一个tcp连接,没有被引用的对象连接会直接断掉.如果不对这个对象进行 ...
- [PHP] 深度解析Nginx下的PHP框架路由实现
所有的框架处理业务请求时,都会处理URL的路径部分,分配到指定的代码中去处理.实现这一功能的关键就是获取$_SERVER全局变量中对于URL部分的数据 当请求的路径为http://test.com/a ...
- 七、数据提取之JSON与JsonPATH
JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式,它使得人们很容易的进行阅读和编写.同时也方便了机器进行解析和生成.适用于进行数据交互的场景,比如网站前台与 ...
- 11. ==和equals方法 & 常量池
一.使用==来判断两个变量是否相等 1. 如果两个变量是基本类型变量,且都是数值类型,则只要两个变量的值相等,就将返回true 2. 如果两个变量是引用类型变量,则只有它们指向同一个对象时,才返回tr ...