写在前面

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

比如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. POJ1185 [NOI2001] 炮兵阵地 (状压DP)

    又是一道有合法性检测的状压题. dp[i][j][k]表示第i行状态为j,i-1行状态为k时前i行放置的最大数量. 注意22行统计二进制数中1的个数时的巧妙方法. 1 #include<cstd ...

  2. Lombok好用是好用,就是容易踩坑,这份避坑指南请查收

    序言 各位好啊,我是会编程的蜗牛,作为java开发者,我们平常在开发过程中,总是希望能够尽量少敲代码.这一方面,当然是为了偷懒,另一方面,当然也是为了代码看起来更加简洁一点,不断往编程规范上靠.然后其 ...

  3. Flink的异步算子的原理及使用

    1.简介 Flink的特点是高吞吐低延迟.但是Flink中的某环节的数据处理逻辑需要和外部系统交互,调用耗时不可控会显著降低集群性能.这时候就可能需要使用异步算子让耗时操作不需要等待结果返回就可以继续 ...

  4. Spring的同一个服务为什么会加载多次?

    问题现象 最近在本地调试公司的一个Web项目时,无意中发现日志中出现了两次同一个服务的init记录,项目都是基于Spring来搭建的,按理说服务都是单例的,应该只有一次服务加载日志才对,本着对工作认真 ...

  5. json文本数据

    本文主要针对三个问题:json格式数据,text数据与json数据之间的关系,json和python字典的区别 1.什么是json数据? json是文本数据,可以在网络中传输的通用数据,它是具有特定格 ...

  6. 39.BasicAuthentication认证

    BasicAuthentication认证介绍 BasicAuthentication使用HTTP基本的认证机制 通过用户名/密码的方式验证,通常用于测试工作,尽量不要线上使用 用户名和密码必须在HT ...

  7. 14.-F对象和Q对象

    一.F对象 一个F对象代表数据库中某条记录的字段的信息 作用 通常是对数据库中的字段值在不获取的情况下进行操作 用于属性(字段)之间的比较   语法: from django.db.models im ...

  8. ML-梯度下降法的详细推导与代码实现

    计算 对于线性回归,梯度下降法的目标就是找到一个足够好的向量\(\theta\),使代价函数\(J(\theta) = \sum_{i=1}^{m}(\hat{y}-y_{i})^{2}\)取得最小值 ...

  9. Python学习之实例1

    一.求n个数字的平均值 n=3 #定义常量n=3 sum=0 #定义求和变量sum count=0 #定义变量count,记录输入数字的次数 print("请输入3个数字:") # ...

  10. Java读取txt文件、excel文件的方法

    Java读取txt文件.excel文件的方法 1.读取txt文件 public static String getFileContent(String filePath,String charset) ...