关于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视图的地址写成通配 ...
随机推荐
- 基于GA遗传算法的TSP旅行商问题求解
import random import math import matplotlib.pyplot as plt import city class no: #该类表示每个点的坐标 def __in ...
- 【JavaSE】面向对象三大特征——封装、继承、多态
前言:本文主要介绍思想 封装 封装这一概念并不仅存在与面向对象中,甚至说封装这一概念不仅限于编程中,其实生活中的封装无处不在.比如 需求:你到银行取钱 参数:你只需要提供银行卡和密码 返回值:柜员会将 ...
- Oracle数据库PLSQL编程和存储过程
一.PLSQL编程 1.1.使用PLSQL实现 Hello world! 1 -- Created on 2022/8/22 by ADMINISTRATOR 2 declare 3 -- 这是申明变 ...
- 二、Celery执行一步任务
二.Celery执行异步任务 2.1.基本使用 创建项目celerypro 创建异步任务执行文件celery_task: import celery import time backend='redi ...
- 深度学习环境搭建常用网址、conda/pip命令行整理(pytorch、paddlepaddle等环境搭建)
前言:最近研究深度学习,安装了好多环境,记录一下,方便后续查阅. 1. Anaconda软件安装 1.1 Anaconda Anaconda是一个用于科学计算的Python发行版,支持Linux.Ma ...
- RDD(弹性分布式数据集)及常用算子
RDD(弹性分布式数据集)及常用算子 RDD(Resilient Distributed Dataset)叫做弹性分布式数据集,是 Spark 中最基本的数据 处理模型.代码中是一个抽象类,它代表一个 ...
- 部署redis-cluster
1.环境准备 ☆ 每个Redis 节点采用相同的相同的Redis版本.相同的密码.硬件配置 ☆ 所有Redis服务器必须没有任何数据 #所有主从节点执行: [root@ubuntu2004 ~]#ba ...
- 基于PCIe的多路视频采集与显示子系统
基于PCIe的多路视频采集与显示子系统 1 概述 视频采集与显示子系统可以实时采集多路视频信号,并存储到视频采集队列中,借助高效的硬实时视频帧出入队列管理和PCIe C2H DMA引擎, ...
- Ubuntu安装Docker及镜像加速器
一.安装Docker sudo apt-get update && sudo apt-get install -y apt-transport-https ca-certificate ...
- 第2-1-3章 docker-compose安装FastDFS,实现文件存储服务
目录 4 docker-compose安装FastDFS 4.1 docker-compose-fastdfs.yml 4.2 nginx.conf 4.3 storage.conf 4.4 测试 4 ...