用Rider写一个有IOC容器Autofac的.net core的程序
一:Autofac是一个和Java里的Spring IOC容器一样的东西,不过它确实没有Spring里的那么方便,主要是在于它没有提供足够的Api和扫描方式等等,不过优点是它比Spring要快很多,而且Spring里的通过注解注入、自动装配、Aop等等通过自己写一定的代码也是可以实现的;
二:这里只先做一个最简单的Autofac的演示,我这里用的是Jetbrains的Rider,说实在话如果VS和Rider在没有配置的前提下个人还是觉得Rider好用,特别是一些快捷输入和源码查看比VS好用的多;
2.1.打开Rider,然后新建一个空的解决方案叫AutofacSolution1;
2.2.然后在此之上Add一个Project,选择.Net Core区域里的Console Application,如叫ConsoleApp1【注意C#实际编程里主入口的Project尽量精简,好能更好的设计出灵活的热部署应用】。
2.3.通过Tools里的Nuget安装Autofac到这个Project里来,然后在Dependency里(VS里对应的是References)的Packages里就是我们通过Nuget安装的依赖;
接下来就直接上代码了,一些用法和解释也直接在代码里:
class Program
{ public string Name { get; set; } static void Main(string[] args)
{
// builder一般只是用来注册Bean的描述信息的(转java蛮久了,习惯了用bean称呼一些特定领域的对象),
var builder = new ContainerBuilder();
// 注意,这里是注册了一个对象【也可以只注册类型builder.RegisterType()】,然后还同时给这个对象进行一个熟悉的装配,这里要注意Resolve如果找不到bean是会报错的
// 如果不确定一定有可以用TryResolve,后面的AsSelf()表示将这个bean的类型以自己的类型为准,还可以通过.AsImplementedInterfaces()来表示Resolve时可以通过其接口来Resolve到bean
// 后面还可以用.PropertiesAutowired()表示对Program类的这个bean做一个所有public set属性的自动装配,不过我们这里手动去做了部分的自动装配就不加这个了;
// 这里还可以设置生命周期,比如某个bean是单例的还是原型的还是基于线程的,还可以register一个Module还实现bean的分开注册(Module对象不会注册,它只起一个桥梁作用)
builder.Register(c => new Program(){Name = c.Resolve<string>()}).AsSelf(); // 还可以给builder添加监听器,比如可以监听IComponentRegistration配置完成的时候产生的事件,从而可以自定义的对它们做一些调整,类似Spring里的BeanPostProcessor之类的
builder.RegisterInstance("数据里防静电").Keyed<string>("a-str").AsSelf(); // 注意一个builder对象不能同时Build()两次
// Build()返回IContainer对象,用于通过特定算法获取注册的bean;
var contailer = builder.Build(); // 如果Program注入了两个bean这里只会取出最后注入的那个
var program = contailer.Resolve<Program>();
// 输出了数据里防静电,说明两个bean都注入成功,且完成的Program属性的装配;
Console.WriteLine(program.Name);
// 还可以通过这种方式获取注入的某种类型的所有的bean;
var programs = contailer.Resolve<IList<Program>>();
Console.WriteLine(programs.Count);
Console.WriteLine("Hello World!"); var listStrType = typeof(List<>).MakeGenericType(typeof(string));
var listStrInstance = Activator.CreateInstance(listStrType);
listStrType.GetMethod("Add").Invoke(listStrInstance, new object[]{"u"}); /**
* 这里给大家提供一下Spring里的@Resource和@Primary以及@Component的实现方式:
* 1.@Component其实是最简单的,就是通过builder.RegisterType(type);来实现,
* 先是通过AppDomain.CurrentDomain.GetAssemblies().Where(a => a.GetCustomAttributes()...)找出那些有[Component]特性的类,然后将他们注册到Autofac里;
*
* 2.@Resource就是在1的基础上通过builder.Register(c => new Program(){Name = c.Resolve<string>()})和反射先创建Program对象,
* 然后来对每个要注入的类判断其所有的属性找出那些有[Resource]的还是通过反射来注入属性;
*
* 3.@Primary它是和@Component一样是注解在需要生产bean的类上面,这个实现其实就是在2的基础上c.Resolve(type)时的这个type是通过typeof(IList<>)的
* MakeGenericType(有@Resource的属性的Type类型),然后就可以将所有的和属性同类型的(Spring里是有byType和byName的说法,这里假设就是byType)bean都找出来
* 然后如果list里只有一个则直接装配,如果多个则找出有@Primary的那个bean(这几个bean有共同的接口),如果都没有则可以像Spring一样抛出异常;
*/
}
}
用Rider写一个有IOC容器Autofac的.net core的程序的更多相关文章
- Ioc容器Autofac系列(1)-- 初窥
一.前言 第一次接触Autofac是因为CMS系统--Orchard,后来在一个开源爬虫系统--NCrawler中也碰到过,随着深入了解,我越发觉得Ioc容器是Web开发中必不可少的利器.那么,Io ...
- IoC容器Autofac - Autofac + Asp.net MVC + EF Code First(转载)
转载地址:http://www.cnblogs.com/JustRun1983/archive/2013/03/28/2981645.html 有修改 Autofac通过Controller默认构造 ...
- IoC容器Autofac学习笔记
一.一个没有使用IoC的例子 IoC的全称是Inversion of Control,中文叫控制反转.要理解控制反转,可以看看非控制反转的一个例子. public class MPGMovieList ...
- [转]Ioc容器Autofac
本文转自:http://www.cnblogs.com/hkncd/archive/2012/11/21/2780041.html Ioc容器Autofac系列(1)-- 初窥 前言 第一次接触A ...
- IoC容器Autofac(5) - Autofac在Asp.net MVC Filter中的应用
Autofac结合EF在MVC中的使用,上一篇IoC容器Autofac(4) - Autofact + Asp.net MVC + EF Code First(附源码)已经介绍了.但是只是MVC中Co ...
- .net core2.0下Ioc容器Autofac使用
.net core发布有一段时间了,最近两个月开始使用.net core2.0开发项目,大大小小遇到了一些问题.准备写个系列介绍一下是如何解决这些问题以及对应技术.先从IOC容器Autofac开始该系 ...
- 用Rider写一个由Autofac管理资源的WebAPI应用程序
一:步骤和上一篇创建控制台项目一样,不过这次选择的是.net core区域下的Asp.net web application,Type里选择Web API(Web API类似java里的SpringB ...
- IOC容器 - Autofac概述
Autofac是比较出名的Ioc容器之一,熟悉Orchard的应该熟知.本文直接介绍autofac用法 一.开始 1.NuGet添加或者直接http://code.google.com/p/autof ...
- ASP.NET中IOC容器Autofac(依赖注入DI 控制反转IOC)
IOC的一个重点是在程序运行中,动态的向某个对象提供它所需要的其他对象.这一点是通过DI来实现的.Autofac则是比较流行的一款IOC容器. IoC和DI有什么关系呢?其实它们是同一个概念的不同角度 ...
随机推荐
- WordPress版微信小程序2.1.5版发布
WordPress版微信小程序功能已经基本完善,利用这套程序,搭配WordPress提供的rest api,WordPress网站的站长可以快速搭建属于自己的网站微信小程序 . WordPress版微 ...
- 205. jetcache:你需要知道的小技巧
[视频&交流平台] àSpringBoot视频:http://t.cn/R3QepWG à SpringCloud视频:http://t.cn/R3QeRZc à Spring Boot源码: ...
- 44个Java代码性能优化总结
https://blog.csdn.net/xiang__liu/article/details/79321639 ---稍后有时间整理
- nginx 301跳转
server { server_name xxxx.com; return 301 $scheme://www.xxxx.com$request_uri; }
- ArcGIS自定义工具箱-显示地图文档结构
ArcGIS自定义工具箱-显示地图文档结构 联系方式:谢老师,135-4855-4328,xiexiaokui#qq.com 目的:显示地图文档mxd的数据组织结构,数据框,图层,表 使用方法: 地图 ...
- http://www.36dsj.com/archives/46131
https://docs.growingio.com/Developer%20Document.html https://youdata.163.com/dash/39706/editor?pid=7 ...
- 微信小程序自制提示框(具有输入文本功能)
https://blog.csdn.net/qq_41681675/article/details/81005561
- QUARTZ系列之一-基础概念(Scheduler/Job/JobDetail/Trigger)
摘抄自quartz官方文档: The key interfaces of the Quartz API are: Scheduler - the main API for interacting wi ...
- 《CSAPP》虚拟存储器
虚拟存储器与物理存储器 虚拟存储器(VM)被组织为一个由存放在磁盘上的N个连续的字节大小的单元组成的数组.每一个字节都有一个唯一的虚拟地址,这个唯一的虚拟地址作为数组的索引.磁盘上的数组内容被缓存在主 ...
- idea2017启动ssm项目卡在build阶段后报outofmemory
如上图,设置build process heap size(Mbytes)(构建过程堆大小(单位MB))为4000,即约4GB.之前设置的是700,修改之后问题解决. 补充:导入新项目后,此参数会初始 ...