写在前面

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

比如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. ubuntu安装及使用

    ubuntu教程 一. Ubuntu简介 Ubuntu(乌班图)是一个基于Debian的以桌面应用为主的Linux操作系统,据说其名称来自非洲南部祖鲁语或科萨语的"ubuntu"一 ...

  2. 使用@Param标识参数

    可以通过@Param注解标识mapper接口中的方法参数 此时,会将这些参数放在map集合中,以@Param注解的value属性值为键,以参数为值: 以 param1,param2...为键,以参数为 ...

  3. 网页头部的声明应该是用 lang="zh" 还是 lang="zh-CN"?

    网页头部的声明应该是用 lang="zh" 还是 lang="zh-CN"? 遇到问题 不知道大家有没有留意到一个问题,就是使用 VsCode 新建的 html ...

  4. python3使用mutagen进行音频元数据处理

    python版本:python 3.9   mutagen版本:1.46.0 mutagen是一个处理音频元数据的python模块,支持多种音频格式,是一个纯粹的python库,仅依赖python标准 ...

  5. Trino Worker 规避 OOM 思路

    背景 Trino 集群如果不做任何配置优化,按照默认配置上线,Master 和 Worker 节点都很容易发生 OOM.本文从 Trino 内存设计出发, 分析 Trino 内存管理机制,到限制与优化 ...

  6. Codeforces Global Round 23 A-D

    比赛链接 A 题解 知识点:贪心,构造. 注意到有 \(1\) 就一定能构造. 时间复杂度 \(O(n)\) 空间复杂度 \(O(1)\) 代码 #include <bits/stdc++.h& ...

  7. 你不知道的React Developer Tools,20 分钟带你掌握 9 个 React 组件调试技巧

    壹 ❀ 引 React Developer Tools 是 React 官方推出的开发者插件,可以毫不夸张的说,它在我们日常组件开发中,对于组件属性以及文件定位,props 排查等等场景都扮演者至关重 ...

  8. 论文笔记 - Fantastically Ordered Prompts and Where to Find Them: Overcoming Few-Shot Prompt Order Sensitivity

    prompt 的影响因素 Motivation Prompt 中 Example 的排列顺序对模型性能有较大影响(即使已经校准参见好的情况下,选取不同的排列顺序依然会有很大的方差): 校准可以大幅度提 ...

  9. Datatable 数据源

    数据源类型 Datatable可以使用三种基本的JavaScript数据类型作为数据源 数组(Arrays[]) 对象(objects{}) 实例(new myclass()) 目前使用过的为前两种, ...

  10. mysql是如何实现mvcc的

    mvcc的概念 mvcc即多版本并发控制,是一种并发控制的策略,能让数据库在高并发下做到安全高效的读写,提升数据库的并发性能; 是一种用来解决并发下读写冲突的无锁解决方案,为事务分配单向增长时间戳,为 ...