关于asp.net mvc的控制器的依赖注入思考及对StructureMap依赖注入框架的简单实践笔记
写在前面:
依赖注入这个玩意很多人其实都接触过,但可能没有细究其中的原理。
比如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依赖注入框架的简单实践笔记的更多相关文章
- ASP.NET MVC 5 - 控制器
MVC代表: 模型-视图-控制器 .MVC是一个架构良好并且易于测试和易于维护的开发模式.基于MVC模式的应用程序包含: · Models: 表示该应用程序的数据并使用验证逻辑来强制实施业务规则的数据 ...
- .NET/ASP.NET MVC Controller 控制器(IController控制器的创建过程)
阅读目录: 1.开篇介绍 2.ASP.NETMVC IControllerFactory 控制器工厂接口 3.ASP.NETMVC DefaultControllerFactory 默认控制器工厂 4 ...
- 三、ASP.NET MVC Controller 控制器(二:IController控制器的创建过程)
阅读目录: 1.开篇介绍 2.ASP.NETMVC IControllerFactory 控制器工厂接口 3.ASP.NETMVC DefaultControllerFactory 默认控制器工厂 4 ...
- c#异步编程(三)—ASP.NET MVC 异步控制器及EF异步操作
ASP.NET MVC 异步控制器及EF异步操作 异步控制器 ASP.NET MVC2后开始了对异步请求管道的支持,异步请求管道的作用是允许web服务器处理长时间运行的请求,比如 那些花费大量时间等待 ...
- [转]ASP.NET MVC 5 - 控制器
MVC代表: 模型-视图-控制器 .MVC是一个架构良好并且易于测试和易于维护的开发模式.基于MVC模式的应用程序包含: · Models: 表示该应用程序的数据并使用验证逻辑来强制实施业务规则的数据 ...
- 关于ASP.NET MVC+Repository+Service架构的一些思考
看了一些ASP.NET MVC开源项目后的一些想法,关于ASP.NET MVC+Repository+Service架构的一些思考 最近在学习ASP.NET MVC 2.0的一些开源项目,发现这些项目 ...
- ASP.NET MVC 创建控制器类过程
MvcHandler.ProcessRequestInit()方法: 1.1获取控制器的名称string requiredString = this.RequestContext.RouteData. ...
- .NET/ASP.NET MVC Controller 控制器(深入解析控制器运行原理)
阅读目录: 1.开篇介绍 2.ASP.NETMVC Controller 控制器的入口(Controller的执行流程) 3.ASP.NETMVC Controller 控制器的入口(Controll ...
- ASP.NET MVC系列:控制器的Edit方法
在前面我们已经介绍了如何创建控制器.视图和数据模型,运行之前的项目并打开Movies主页,将鼠标悬停在“编辑”菜单上,你会看到浏览器右下角显示了“编辑”链接的地址
- Asp.net Mvc 多级控制器 路由重写 及 多级Views目录 的寻找视图的规则 (多级路由) 如:Admin/Test/Index
http://blog.csdn.net/buhuan123/article/details/26387427 目录(?)[-] 1那么我们再来看我们需要的访问方式如下图 razor视图的地址写成通配 ...
随机推荐
- P4047 [JSOI2010]部落划分 方法记录
原题链接 [JSOI2010]部落划分 题目描述 聪聪研究发现,荒岛野人总是过着群居的生活,但是,并不是整个荒岛上的所有野人都属于同一个部落,野人们总是拉帮结派形成属于自己的部落,不同的部落之间则经常 ...
- 微光互联 TX800-U 扫码器无法输出中文到光标的问题
问题背景 某检测场有一批扫码器,购于微光互联,型号 TX800-U,用于在不同办理窗口间扫描纸质材料上的二维码,简化录入过程.扫码器通过 USB 接入 PC 系统 (windows),自动安装驱动,接 ...
- 通过netty把百度地图API获取的地理位置从Android端发送到Java服务器端
本篇记录我在实现时的思考过程,写给之后可能遇到困难的我自己也给到需要帮助的人. 写的比较浅显,见谅. 在写项目代码的时候,需要把Android端的位置信息传输到服务器端,通过Netty达到连续传输的效 ...
- CCS 2022 极客少年挑战赛 writeup
目录 题目一DSDS 操作内容: 题目二 easy_re 操作内容: flag值: 题目三 1+1=all 解题过程 题目一DSDS 操作内容: 开环境然后进入网址在网址后./目录 进入目录得到个 ...
- 一天五道Java面试题----第八天(怎么处理慢查询--------->简述Myisam和innodb的区别)
这里是参考B站上的大佬做的面试题笔记.大家也可以去看视频讲解!!! 文章目录 1.怎么处理慢查询 2.ACID靠什么保证的 3.什么是MVCC 4.mysql主从同步原理 5.简述Myisam和inn ...
- NAS数据存储之NFS搭建和使用
NFS是主流异构平台的共享文件系统之一,能够支持在不同类型的系统之间通过网络进行文件共享,允许一个系统在网络上与他人共享目录和文件.NFS传输协议用于服务器和客户机之间的文件访问和共享通信,从而使客户 ...
- Python基础之面向对象:1、面向对象及编程思想
一.人狗大战 1.需求 用代码模拟人.狗打架的小游戏 人和狗种类不同,因此双方的属性各不相同 推导一: 人和狗各有不同属性 使用字典方式储存属性较为方便,并可储存多种属性 # 1.在字典内储存'人'属 ...
- 【k8s连载系列】k8s介绍
k8s是Kubernetes的缩写,Google 于 2014 年开源了 Kubernetes 项目. 一.k8s的历史演变 k8s的演变过程:首先从传统的服务-->虚拟机部署-->容器部 ...
- 思维分析逻辑 3 DAY
目录 指标分析 指标选择原则 指标体系建立 步骤 流量分析 渠道分析(从哪来) 常见渠道及渠道分类 渠道推广过程 渠道的指标 渠道分析方法 转化及价值分析(经过什么?产生什么价值?) 漏斗分析 功能模 ...
- mysql 多个结构不同表查询 返回相同字段名
( select ID,数据库原字段名1 AS 统一字段名1,数据库原字段名2 AS 统一字段名2 from 第一个表名 WHERE 1) UNION(联合表查询)( select ID,数据库原字段 ...