一: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. solidworks建立三维模型里面的几何对象和工程图里面的元素的联系

    本文是帮助里面的一个例子, 首先打开一个三维模型和对应的工程图,保持三维模型为当前激活窗口,在三维模型里面选中一个面或者一个边,然后运行下面的代码, 会将工程图里面的第一视图里面对应的投影元素的线型的 ...

  2. vue+窗格切换+田字+dicom显示_03

    环境:vue+webpack+cornerstone ide:vs code 需求:窗格设置+拼图设置 代码: 主体:printPage.vue <div class="div mid ...

  3. bzoj2141排队

    /* 动态求逆序对,可以树套树来写, 将交换操作理解成插入和删除比较好理解, 里层是个区间求和的线段树就好了 或者叫 带修主席树? */ #include<cstdio> #include ...

  4. Mac搭建kubernetes dashboard全流程

    1. 下载dashboard文件: curl -o kubernetes-dashboard.yaml https://raw.githubusercontent.com/kubernetes/das ...

  5. 浅析MySQL中concat以及group_concat的使用

      说明: 本文中使用的例子均在下面的数据库表tt2下执行: 一.concat()函数 1.功能:将多个字符串连接成一个字符串. 2.语法:concat(str1, str2,...) 返回结果为连接 ...

  6. 小程序获取微信用户的openid

    小程序获取微信用户的openid //index.js //获取应用实例 const app = getApp() Page({ globalData: { appid: '11121221a89e0 ...

  7. spring 之 property-placeholder 分析2

    其实我们可以完全不使用  context:property-placeholder  ,而是使用 PropertySourcesPlaceholderConfigurer : <bean cla ...

  8. leetcode10

    class Solution { public boolean isMatch(String s, String p) { if (s == null || p == null) { return f ...

  9. leetcode48

    根据题目寻找规律,使用临时变量记录被替换的数据. class Solution { public: void rotate(vector<vector<int>>& m ...

  10. CSS 图像大小

    CSS 图像大小 虽然在HTML中,img标签有属性height.width设置高和宽,在工作中却使用得非常少,通常使用CSS来控制大小. 给盒子设置属性height.width限制大小.单位通常是像 ...