zoukankan      html  css  js  c++  java
  • 当职责链遇到DI

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

     1    /// <summary>
     2     /// 第一个任务
     3     /// </summary>
     4     public class FirstTask : ITask
     5     {
     6         ITask _task;
     7         readonly ILogger<FirstTask> _logger;
     8         public FirstTask(ILogger<FirstTask> logger, SecondTask secondTask)
     9         {
    10             _logger = logger;
    11             this.Next(secondTask);
    12         }
    13         //错误姿势
    14         //public FirstTask(ILogger<FirstTask> logger, IEnumerable<ITask> tasks)
    15         //{
    16         //    _logger = logger;
    17         //    foreach (var task in tasks)
    18         //    {
    19         //        if (task is SecondTask)
    20         //        {
    21         //            this.Next(task);
    22         //        }
    23         //    }
    24         //}
    25 
    26         /// <summary>
    27         /// 传送下一个方法
    28         /// </summary>
    29         /// <param name="parentTask"></param>
    30         public void Next(ITask task)
    31         {
    32             Console.WriteLine($"-------------{task.GetType().Name}.Next()");
    33             _task = task;
    34         }
    35         /// <summary>
    36         /// 职责链任务方法
    37         /// </summary>
    38         /// <param name="taskParmeter">任务内容</param>
    39         /// <returns></returns>
    40         public bool ExecuteTask(TaskParmeter taskParmeter)
    41         {
    42             var result = SelfTask(taskParmeter);
    43             return _task.ExecuteTask(taskParmeter) && result;
    44         }
    45         bool SelfTask(TaskParmeter taskParmeter)
    46         {
    47             _logger.LogInformation("-------------------------------------------FirstTask");
    48             return true;
    49         }
    50 }

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

     1     /// <summary>
     2     /// 最后的任务
     3     /// </summary>
     4     public class EndTask : ITask
     5     {       
     6         readonly ILogger<EndTask> _logger;
     7         public EndTask(ILogger<EndTask> logger)
     8         {
     9             _logger = logger;
    10         }
    11   
    12         /// <summary>
    13         /// 职责链任务方法
    14         /// </summary>
    15         /// <param name="taskParmeter">任务内容</param>
    16         /// <returns></returns>
    17         public bool ExecuteTask(TaskParmeter taskParmeter)
    18         {
    19             _logger.LogInformation("-------------------------------------------EndTask");
    20             return true;
    21         }
    22 }

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

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

     1         public void ConfigureServices(IServiceCollection services)
     2         {
     3             //职责链依赖注入
     4             services.AddScoped<EndTask>();
     5             services.AddScoped<ThirdTask>();
     6             services.AddScoped<SecondTask>();
     7             services.AddScoped<FirstTask>();
     8 
     9             //错误姿势
    10             //services.AddScoped<ITask,EndTask>();
    11             //services.AddScoped<ITask, ThirdTask>();
    12             //services.AddScoped<ITask, SecondTask>();
    13             //services.AddScoped<ITask, FirstTask>(); 
    14        }

    在ValuesController中调起第一个任务

     1   public class ValuesController : ControllerBase
     2     {
     3         /// <summary>
     4         /// 第一个任务
     5         /// </summary>
     6         readonly ITask _task;
     7 
     8         public ValuesController(FirstTask firstTask)
     9         {
    10             _task = firstTask;
    11         }
    12         //错误姿势
    13         //public ValuesController(IEnumerable<ITask> tasks)
    14         //{
    15         //    foreach (var task in tasks)
    16         //    {
    17         //        if (task is EndTask)
    18         //        {
    19         //            _task = task;
    20         //        }
    21         //    }
    22         //}
    23 
    24         [HttpGet]
    25         public ActionResult<IEnumerable<string>> Get()
    26         {
    27             //调用第一个任务
    28             _task.ExecuteTask(new TaskParmeter() { TaskID = 1 });
    29      
    30             return new string[] { "value1", "value2" };
    31         }
    32 }
  • 相关阅读:
    Selenium自动化测试-unittest单元测试框架
    Python 面向对象
    【新手总结】在.Net项目中使用Redis作为缓存服务
    asp.net性能优化之使用Redis缓存(入门)
    浅谈MVC、MVP、MVVM架构模式的区别和联系
    jquery uploadify在谷歌浏和火狐下无法上传的解决方案(.Net版)
    [翻译]NUnit---Action Attributes(八)
    [翻译]NUnit---String && Collection && File && Directory Assert (七)
    [翻译]NUnit---Exception && Utility Methods (六)
    [翻译]NUnit---Condition Asserts && Comparisons Asserts && Type Asserts (五)
  • 原文地址:https://www.cnblogs.com/axzxs2001/p/11702738.html
Copyright © 2011-2022 走看看