一: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的程序的更多相关文章

  1. Ioc容器Autofac系列(1)-- 初窥

     一.前言 第一次接触Autofac是因为CMS系统--Orchard,后来在一个开源爬虫系统--NCrawler中也碰到过,随着深入了解,我越发觉得Ioc容器是Web开发中必不可少的利器.那么,Io ...

  2. IoC容器Autofac - Autofac + Asp.net MVC + EF Code First(转载)

    转载地址:http://www.cnblogs.com/JustRun1983/archive/2013/03/28/2981645.html  有修改 Autofac通过Controller默认构造 ...

  3. IoC容器Autofac学习笔记

    一.一个没有使用IoC的例子 IoC的全称是Inversion of Control,中文叫控制反转.要理解控制反转,可以看看非控制反转的一个例子. public class MPGMovieList ...

  4. [转]Ioc容器Autofac

    本文转自:http://www.cnblogs.com/hkncd/archive/2012/11/21/2780041.html Ioc容器Autofac系列(1)-- 初窥   前言 第一次接触A ...

  5. IoC容器Autofac(5) - Autofac在Asp.net MVC Filter中的应用

    Autofac结合EF在MVC中的使用,上一篇IoC容器Autofac(4) - Autofact + Asp.net MVC + EF Code First(附源码)已经介绍了.但是只是MVC中Co ...

  6. .net core2.0下Ioc容器Autofac使用

    .net core发布有一段时间了,最近两个月开始使用.net core2.0开发项目,大大小小遇到了一些问题.准备写个系列介绍一下是如何解决这些问题以及对应技术.先从IOC容器Autofac开始该系 ...

  7. 用Rider写一个由Autofac管理资源的WebAPI应用程序

    一:步骤和上一篇创建控制台项目一样,不过这次选择的是.net core区域下的Asp.net web application,Type里选择Web API(Web API类似java里的SpringB ...

  8. IOC容器 - Autofac概述

    Autofac是比较出名的Ioc容器之一,熟悉Orchard的应该熟知.本文直接介绍autofac用法 一.开始 1.NuGet添加或者直接http://code.google.com/p/autof ...

  9. ASP.NET中IOC容器Autofac(依赖注入DI 控制反转IOC)

    IOC的一个重点是在程序运行中,动态的向某个对象提供它所需要的其他对象.这一点是通过DI来实现的.Autofac则是比较流行的一款IOC容器. IoC和DI有什么关系呢?其实它们是同一个概念的不同角度 ...

随机推荐

  1. css3兼容性检测工具

    1.   Modernizr  会在Modernizr 会在页面加载后立即检测特性:然后创建一个包含检测结果的 JavaScript 对象,同时在 html 元素加入方便你调整 CSS 的 class ...

  2. sqlserver数据库镜像运行模式

    运行模式: 从大层面来说,SQL Server镜像只有两种模式:高安全模式和高性能模式.两种模式的主要区别在于在事务提交后的操作.可以从图1-1中查看运行模式. 在高性能模式下,主体服务器不需要等待镜 ...

  3. java网络编程-单线程服务端与客户端通信

    该服务器一次只能处理一个客户端请求;p/** * 利用Socket进行简单服务端与客户端连接 * 这是服务端 */public class EchoServer { private ServerSoc ...

  4. java性能优化总结

    本人在java中积累了一些性能优化相关的经验,现在总结如下: 批量处理服务性能优化 RTB服务性能优化 BasicData线上问题解决,疯狂FullGC的问题 BasicData线上部分服务器cpu使 ...

  5. BBS(第一天)项目之 注册功能实现通过forms验证与 前端ajax请求触发查询数据库判断用户是否存在的功能实现

    1.BBS项目之注册功能通过forms验证 from django import forms from blog.models import User from django.contrib.auth ...

  6. python中的异常处理常用方法

    异常处理 什么是异常? 异常就是与正常情况不同,程序在执行过程中出现错误,导致无法执行完毕.异常其实就是代码执行过程中出错. 常见的一些异常 AttributeError 试图访问一个对象没有的属性, ...

  7. 深入剖析GPU Early Z优化

    最近在公司群里同事发了一个UE4关于Mask材质的优化,比如在场景中有大面积的草和树的时候,可以在很大程度上提高效率.这其中的原理就是利用了GPU的特性Early Z,但是它的做法跟我最开始的理解有些 ...

  8. 剑指offer例题——二进制中1的个数

    题目:输入一个整数,输出该二进制表示中1的个数.其中负数用补码表示. 首先明确补码的定义: 原码 反码 补码 将最高位作为符号位(0表示正,1表示负), 其它数字位表达数值本身的绝对值的数字表示方式 ...

  9. metrics+spring+influxdb整合

    1.在maven项目的pom.xml引入metrics-spring和metrics-influxdb两个jar包 <dependency> <groupId>com.ryan ...

  10. vue 关键词模糊查询

    页面html,绑定的列表数据为datas,关键词为 select_words,如下图 其中d.accounts和d.roleName是需要进行搜索的字段,也可以进行大小写都可以