当职责链遇到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) 使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系. 将这个对象连成一条链,并沿着这条链传递该请求,直到有一个 ...
随机推荐
- ROS kinetic + Realsens D435i + ORK + LINEMOD 物体识别
1. ORK 网址:https://wg-perception.github.io/object_recognition_core/ ORK (Object Recognition Kitchen) ...
- Saiku ui-settings接口404错误避免(二十九)
Saiku ui-settings接口404错误避免 自己手动编译的saiku ,不知道为什么前端总是报错 /saiku/rest/saiku/info/ui-settings 404NotFo ...
- H5生成二维码
要用H5生成二维码: 1.引入js库,可自行点击链接复制使用 <script type="text/javascript" src="http://static.r ...
- linux的vi编辑器常用用法一览
vi 命令用于编辑文本文件,语法: vi 文件名 vi 是一个比较强大的编辑工具,类似于windows下的notepad,但是功能要强大的多.vi分为三种模式,分别是“一般模式”,“编辑模式”,“命令 ...
- nodejs环境下的socket通信
结构: socket是应用层和传输层的桥梁.(传输层之上的协议所涉及的数据都是在本机处理的,并没进入网络中) 涉及数据: socket所涉及的数据是报文,是明文. 作用: 建立长久链接,供网络上的两个 ...
- jquery 图片缩放插件使用
https://cdn.bootcss.com/d3-transition/1.1.1/d3-transition.js http://www.jq22.com/jquery-info9291
- java主函数
相信很多初次接触java的同学,在遇见主函数的时候,听到最多的就是主函数的格式是固定的,不能进行修改等等.这就让人疑惑了,主函数为啥就那么特殊呢?接下来博主会为大家解释主函数.大家先看看下面这个程序: ...
- centOS服务器安装mongodb
1.为服务器添加mongodb的包管理工具,这就相当于在windows中安装npm,以便能用npm安装各种依赖.添加了这个包管理工具,才能在后面对mongodb做一系列操作. touch /etc/y ...
- WebService发布服务例子
import javax.jws.WebMethod; import javax.jws.WebService; @WebService public interface WebServiceI { ...
- 爬取动态html网页,requests+execjs
请求地址:https://g.hongshu.com/content/99269/15382723.html 网页内容为动态执行js所得 1.直接浏览器模拟 不用考虑页面的业务逻辑什么的,直接得到结果 ...