写在前面

依赖注入这个玩意很多人其实都接触过,但可能没有细究其中的原理。

比如Controller的构造函数中,只要你传入一些接口,应用自动就给你处理了创建的过程,无需你手动去new 一个实例并穿进去来创建Controller.

比如:

    public class LoginController : BaseController
{ public LoginController(IOptions<AppSet> option) : base(option)
{ }
}

或者

    public class APIController : ControllerBase
{
private readonly IHttpContextAccessor httpContextAccessor; // GET api/values
public APIController(IHttpContextAccessor httpContextAccessor)
{
this.httpContextAccessor = httpContextAccessor;
}
}

技术分析

试想,如果没有一个注入机制,我们肯定得来 new 创建对象了。new不但类,而且后期还不好改,因为有100个地方则new 了100个地方,想换一个接口的实现类,就需要到处去修改了。于是有人就推出了专门解决类似问题的框架,本文介绍:StructureMap.

使用场景:(假设有验证码登录,短信验证登录...):

    public interface ILog
{
void Work();
}
public interface ILogin
{
void Work();
}
public interface IReposibility
{
void Work();
}
public interface ISmsCode
{
void Work();
}
public interface IVerifyCode
{
void Work();
}

相关的实现类:

    /// <summary>
/// 账号密码+短信的登录
/// </summary>
public class LoginWithSmsCode : ILogin
{
/// <summary>
///
/// </summary>
/// <param name="reposibility"></param>
/// <param name="verifyCode"></param>
public LoginWithSmsCode(IReposibility reposibility, ISmsCode smsCode)
{
ConfigLab.Utils.SaveLog($"LoginWithSmsCode:被创建");
}
public void Work()
{ }
} /// <summary>
/// 账号密码+验证码的登录
/// </summary>
public class LoginWithVerifyCode:ILogin
{
/// <summary>
///
/// </summary>
/// <param name="reposibility"></param>
/// <param name="verifyCode"></param>
public LoginWithVerifyCode(IReposibility reposibility,IVerifyCode verifyCode)
{
ConfigLab.Utils.SaveLog($"LoginWithVerifyCode:被创建");
}
public void Work()
{ }
}
public class SmsCode:ISmsCode
{
public SmsCode(IReposibility reposibility,ILog log)
{
ConfigLab.Utils.SaveLog($"SmsCode:被创建");
}
public void Work()
{ }
}
public class VerifyCode :IVerifyCode
{
public VerifyCode(IReposibility reposibility, ILog log)
{
ConfigLab.Utils.SaveLog($"VerifyCode:被创建");
}
public void Work()
{ }
}
public class Reposibility:IReposibility
{
public Reposibility()
{
ConfigLab.Utils.SaveLog($"Reposibility:被创建");
}
public void Work()
{ }
}
public class Log:ILog
{
public Log()
{
ConfigLab.Utils.SaveLog($"Log:被创建");
}
public void Work()
{ }
}

StructureMap使用-容器初始化:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using StructureMap;
using ConfigLab.LabCore.IocLab.Interfaces;
using ConfigLab.LabCore.IocLab;
using System.Runtime.CompilerServices; namespace ConfigLab.LabCore
{
/// <summary>
/// 功能简介:StructureMap容器的初始化
/// 作者:http://cnblogs.com/taohuadaozhu
/// 备注:这里只用了一些简单的处理,还有自动扫描程序集scan等,可自行查找StructureMap的资料.
/// </summary>
public static class AppRunContext
{
private static Container _gContainner = null;
public static Container gContainner
{
get
{
if (_gContainner == null)
{
Init();
}
return _gContainner;
}
}
/// <summary>
/// 功能简介:初始化(应用程序只需一次初始化),可以放到服务的初始化或者asp.net mvc中Application_Start中。
/// </summary>
private static void Init()
{
_gContainner = new Container(_=> {
_.For<ILogin>().Use<LoginWithVerifyCode>();
_.For<ISmsCode>().Use<SmsCode>();
_.For<IVerifyCode>().Use<VerifyCode>();
_.For<ILog>().Use<Log>();
_.For<IReposibility>().Use<Reposibility>();
});
}
}
}

StructureMap使用-创建接口的实现类对象:

            ILogin login= AppRunContext.gContainner.GetInstance<ILogin>();//这里每次创建无需指定是验证码还是短信验证,在初始化的时候规定了,如果修改只需修改初始化容器那块。

关于asp.net mvc的控制器的依赖注入思考及对StructureMap依赖注入框架的简单实践笔记的更多相关文章

  1. ASP.NET MVC 5 - 控制器

    MVC代表: 模型-视图-控制器 .MVC是一个架构良好并且易于测试和易于维护的开发模式.基于MVC模式的应用程序包含: · Models: 表示该应用程序的数据并使用验证逻辑来强制实施业务规则的数据 ...

  2. .NET/ASP.NET MVC Controller 控制器(IController控制器的创建过程)

    阅读目录: 1.开篇介绍 2.ASP.NETMVC IControllerFactory 控制器工厂接口 3.ASP.NETMVC DefaultControllerFactory 默认控制器工厂 4 ...

  3. 三、ASP.NET MVC Controller 控制器(二:IController控制器的创建过程)

    阅读目录: 1.开篇介绍 2.ASP.NETMVC IControllerFactory 控制器工厂接口 3.ASP.NETMVC DefaultControllerFactory 默认控制器工厂 4 ...

  4. c#异步编程(三)—ASP.NET MVC 异步控制器及EF异步操作

    ASP.NET MVC 异步控制器及EF异步操作 异步控制器 ASP.NET MVC2后开始了对异步请求管道的支持,异步请求管道的作用是允许web服务器处理长时间运行的请求,比如 那些花费大量时间等待 ...

  5. [转]ASP.NET MVC 5 - 控制器

    MVC代表: 模型-视图-控制器 .MVC是一个架构良好并且易于测试和易于维护的开发模式.基于MVC模式的应用程序包含: · Models: 表示该应用程序的数据并使用验证逻辑来强制实施业务规则的数据 ...

  6. 关于ASP.NET MVC+Repository+Service架构的一些思考

    看了一些ASP.NET MVC开源项目后的一些想法,关于ASP.NET MVC+Repository+Service架构的一些思考 最近在学习ASP.NET MVC 2.0的一些开源项目,发现这些项目 ...

  7. ASP.NET MVC 创建控制器类过程

    MvcHandler.ProcessRequestInit()方法: 1.1获取控制器的名称string requiredString = this.RequestContext.RouteData. ...

  8. .NET/ASP.NET MVC Controller 控制器(深入解析控制器运行原理)

    阅读目录: 1.开篇介绍 2.ASP.NETMVC Controller 控制器的入口(Controller的执行流程) 3.ASP.NETMVC Controller 控制器的入口(Controll ...

  9. ASP.NET MVC系列:控制器的Edit方法

    在前面我们已经介绍了如何创建控制器.视图和数据模型,运行之前的项目并打开Movies主页,将鼠标悬停在“编辑”菜单上,你会看到浏览器右下角显示了“编辑”链接的地址

  10. Asp.net Mvc 多级控制器 路由重写 及 多级Views目录 的寻找视图的规则 (多级路由) 如:Admin/Test/Index

    http://blog.csdn.net/buhuan123/article/details/26387427 目录(?)[-] 1那么我们再来看我们需要的访问方式如下图 razor视图的地址写成通配 ...

随机推荐

  1. Kafka之工作流程分析

    Kafka之工作流程分析 kafka核心组成 一.Kafka生产过程分析 1.1 写入方式 producer采用推(push)模式将消息发布到broker,每条消息都被追加(append)到分区(pa ...

  2. 齐博x1齐博首创钩子的使用方法

    齐博X1有两套钩子体系,第一套是基于TP思路设计的.跟外面的大同小异.现在重点讲一下第二套我们首创的使用方法. 首先说一下如何埋钩子,这个跟TP思路的钩子类似,就是在页面的任何地方加入如下代码即可如下 ...

  3. React魔法堂:size-sensor源码略读

    前言 echarts-for-react在对echarts进行轻量级封装的基础上,额外提供图表尺寸自适应容器尺寸的这小而实用的功能,而这功能的背后就是本文想介绍的size-sensor了. 源码介绍 ...

  4. NLP之TextLSTM(预测单词下一个字母)

    LSTM 目录 LSTM 1.理论 1.1 LSTM与RNN 1.1.1 RNN的缺点 1.1.2 LSTM 1.2 LSTM基本结构 2.实验 2.1 实验步骤 2.2 算法模型 1.理论 1.1 ...

  5. "一键重装系统软件"操作流程

    博主之前重装系统都是直接用win10系统更新里的重置系统(版本不会变化),和U盘重装电脑出厂映像(有各种品牌自带的软件,而且由于是出场版本,版本很低) 所以这次用"小白一键重装系统" ...

  6. LcdTools如何使用PX01进行EDP屏EDID比对及设置显示EDID比对结果

    PX01点EDP屏在上电过程会自动读取屏EDID,那怎么进行EDID比对呢? LcdTools打开点屏工程,在上电时序函数中先用SetCmpEDID()指令设置EDID比对值,再调用CheckEDID ...

  7. 人生苦短,我用 python 之入门篇

    Python 是一种跨平台的,开源的,免费的,解释型的高级编程语言,它具有丰富和强大的库,其应用领域也非常广泛,在 web 编程/图形处理/黑客编程/大数据处理/网络爬虫和科学计算等领域都能找到其身影 ...

  8. 前后端分离项目(九):实现"添加"功能(后端接口)

    好家伙,来了来了,"查"已经完成了,现在是"增" 前端的视图已经做好了,现在我们来完善后端 后端目录结构   完整代码在前后端分离项目(五):数据分页查询(后端 ...

  9. 深度学习环境搭建常用网址、conda/pip命令行整理(pytorch、paddlepaddle等环境搭建)

    前言:最近研究深度学习,安装了好多环境,记录一下,方便后续查阅. 1. Anaconda软件安装 1.1 Anaconda Anaconda是一个用于科学计算的Python发行版,支持Linux.Ma ...

  10. java反序列化漏洞cc_link_one

    CC-LINK-one 前言 这里也正式进入的java的反序列化漏洞了,简单介绍一下CC是什么借用一些官方的解释:Apache Commons是Apache软件基金会的项目,曾经隶属于Jakarta项 ...