.net core从依赖注入容器获取对象
创建引擎方法:该方法用于在不使用构造注入的情况下从依赖注入容器中获取对象
/// <summary>
/// 一个负责创建对象的引擎
/// </summary>
public interface IEngine
{
T Resolve<T>();
}
/// <summary>
/// 引擎实现类
/// </summary>
public class GeneralEngine : IEngine
{
private IServiceProvider _provider;
public GeneralEngine(IServiceProvider provider)
{
this._provider = provider;
}
/// <summary>
/// 构建实例
/// </summary>
/// <typeparam name="T"></typeparam>
/// <returns></returns>
public T Resolve<T>()
{
return _provider.GetService<T>();
}
}
/// <summary>
/// 引擎上下文,在项目初始化过程中实例化一个引擎实例
/// </summary>
public class EngineContext
{
private static IEngine _engine;
[MethodImpl(MethodImplOptions.Synchronized)]
public static IEngine initialize(IEngine engine)
{
if (_engine == null)
{
_engine = engine;
}
return _engine;
}
/// <summary>
/// 当前引擎
/// </summary>
public static IEngine Current
{
get
{
return _engine;
}
}
}
利用上面定义的引擎上下文初始化引擎实例
public void ConfigureServices(IServiceCollection services)
{
//services.Configure<CookiePolicyOptions>(options =>
//{
// // This lambda determines whether user consent for non-essential cookies is needed for a given request.
// options.CheckConsentNeeded = context => true;
// options.MinimumSameSitePolicy = SameSiteMode.None;
//}); services.AddMvc();
services.AddDbContext<GeneralDbContext>(options => options.UseSqlServer( Configuration.GetConnectionString("DefaultConnectionString")
)); // services.AddScoped<ICategoryService, CategoryService>();
services.AddAssembly("General.Services");
services.AddScoped(typeof(IRepository<>),typeof(EfRepository<>));
EngineContext.initialize(new GeneralEngine(services.BuildServiceProvider())); services.AddAuthentication();
}
在controller中使用
public class CategoryController : Controller
{
private ICategoryService _categoryService;
//public CategoryController(ICategoryService categoryService)
//{
// this._categoryService = categoryService;
//}
public IActionResult Index()
{
return View();
} public IActionResult AddCate()
{
_categoryService = EngineContext.Current.Resolve<ICategoryService>();
_categoryService.Add(new CategoryEntity
{
IsMenu = false,
Name = "用户管理4",
IsDisabled = true
}); return Content("保存成功");
}
}
.net core从依赖注入容器获取对象的更多相关文章
- Asp.net core自定义依赖注入容器,替换自带容器
依赖注入 在asp.net core程序中,众所周知,依赖注入基本上贯穿了整个项目,以通用的结构来讲解,控制器层(Controller层)依赖业务层(Service层),业务层依赖于仓储层(Repos ...
- 几十行代码实现ASP.NET Core自动依赖注入
在开发.NET Core web服务的时候,我们习惯使用自带的依赖注入容器来进行注入. 于是就会经常进行一个很频繁的的重复动作:定义一个接口->写实现类->注入 有时候会忘了写Add这一步 ...
- Asp.Net Core 进阶(三)—— IServiceCollection依赖注入容器和使用Autofac替换它
Asp.Net Core 提供了默认的依赖注入容器 IServiceCollection,它是一个轻量级的依赖注入容器,所以功能不多,只是提供了基础的一些功能,要实现AOP就有点麻烦,因此在实际工作当 ...
- ASP.NET Core之依赖注入
本文翻译自:http://www.tutorialsteacher.com/core/dependency-injection-in-aspnet-core ASP.NET Core支持依赖注入,依赖 ...
- 【半小时大话.net依赖注入】(下)详解AutoFac+实战Mvc、Api以及.NET Core的依赖注入
系列目录 上|理论基础+实战控制台程序实现AutoFac注入 下|详解AutoFac+实战Mvc.Api以及.NET Core的依赖注入 前言 本来计划是五篇文章的,每章发个半小时随便翻翻就能懂,但是 ...
- 重新整理 .net core 实践篇————依赖注入应用[二]
前言 这里介绍一下.net core的依赖注入框架,其中其代码原理在我的另一个整理<<重新整理 1400篇>>中已经写了,故而专门整理应用这一块. 以下只是个人整理,如有问题, ...
- Yii2.0 依赖注入(DI)和依赖注入容器的原理
依赖注入和依赖注入容器 为了降低代码耦合程度,提高项目的可维护性,Yii采用多许多当下最流行又相对成熟的设计模式,包括了依赖注入(Denpdency Injection, DI)和服务定位器(Serv ...
- Unity轻量级依赖注入容器
一.前言 Unity是一个轻量级的可扩展的依赖注入容器,支持构造函数,属性和方法调用注入.在Nuget里安装unity
- yii2之依赖注入与依赖注入容器
一.为什么需要依赖注入 首先我们先不管什么是依赖注入,先来分析一下没有使用依赖注入会有什么样的结果.假设我们有一个gmail邮件服务类GMail,然后有另一个类User,User类需要使用发邮件的功能 ...
随机推荐
- openresty 一些可选的模板引擎
以下为一些 openresty 可选的模板引擎,方便使用 lemplate (https://github.com/openresty/lemplate) lua-resty-tags (https: ...
- 数学的语言 化无形为可见 (Keith Devlin 著)
第一章 数字为何靠的住 (已看) 第二章 心智的模式 (已看) 第三章 动静有数 (已看) 第四章 当数学成型 (已看) 第五章 数学揭开美之本质 (已看) 第六章 当数学到位 (已看) 第七章 数学 ...
- 爱今天 APP 闪退怎么办?
爱今天 APP 闪退怎么办? 爱今天是一款简洁优秀的时间记录 APP. 但也有一些小 Bug,可能是因为不同的手机兼容问题,在添加时间时会出现闪退现象. 可能是因为自己修改了添加时间的方式. 可以通过 ...
- HBase源码分析之WAL
WAL(Write-Ahead Logging)是数据库系统中保障原子性和持久性的技术,通过使用WAL可以将数据的随机写入变为顺序写入,可以提高数据写入的性能.在hbase中写入数据时,会将数据写入内 ...
- learnopengl“入门”的全部代码
projection 里的角度,角度越大,物体离摄像机越远:角度越小,物体离摄像机越近,这个角度表示视野(fov),视野越大,看到的物体就越小 头文件 #ifndef SHADER_H_INCLUDE ...
- python核心类库:urllib使用详解
python版本:2.7.15 1.简单用法urllib.urlopen() 语法:urllib.urlopen(url[, data[, proxies]]) :打开一个url的方法,返回一个文件对 ...
- 2、visualBox虚拟机扩容
1.找到VBoxManager工具 1)打开Finder,找到[应用程序],在右侧找到VirtualBox.app,然后打开右键,找到[显示包内容],点击打开 2.打开终端,来到这个目录下 cd /A ...
- mysql 主从复制change master to
CHANGE MASTER TO命令用于slave配置连接master的信息,例如master host.master port等. 关于CHANGE MASTER TO命令,总结几点使用心得. 在C ...
- Linux rcp命令详解
Linux rcp命令 Linux rcp命令用于复制远程文件或目录. rcp指令用在远端复制文件或目录,如同时指定两个以上的文件或目录,且最后的目的地是一个已经存在的目录,则它会把前面指定的所有文件 ...
- FFMPEG Qt视频播放器
本文是根据PaintEvent事件处理函数不停在组件中绘制视频帧数据 做过图像界面开发的都知道,任何耗时的操作都不能放在主线程进行,一旦主线程阻塞了,那么体现出来的就是界面卡了. 而我们读取视频和解码 ...