Autofac - 组件
快到年终了, 最近项目比较悠闲, 就想总结下, 项目中所使用到的一些技术, 以及使用方法.
之前有写过Dapper以及Dapper的一个扩展, 这些也是项目中使用过的. 算是一个温故而知新吧.
代码:
public interface IAnimal
{
void Say();
} public class Dog : IAnimal
{
public string Name { get; set; }
public void Say()
{
Console.WriteLine("汪汪汪!");
if (!string.IsNullOrEmpty(Name))
{
Console.WriteLine("此汪名叫 " + Name);
}
}
} public class Cat : IAnimal
{
public string Name { get; set; }
public void Say()
{
Console.WriteLine("喵喵喵!");
if (!string.IsNullOrEmpty(Name))
{
Console.WriteLine("此喵名叫 " + Name);
}
}
} public class Person
{
IAnimal adopt; public Person() { } public void Self()
{
Console.WriteLine("我是主人");
} public Person(IAnimal MyPerson)
{
adopt = MyPerson;
} public void Say()
{
Console.WriteLine("我领养了一只小动物");
adopt.Say();
}
}
一、类型注册
类型的注册, 使用的方法是container.Resolve<Type>()和container.Resolve(typeof(Type))两个方法.
示例:
var builder = new ContainerBuilder(); builder.RegisterType<Person>();
builder.RegisterType<Dog>().As<IAnimal>();
builder.RegisterType(typeof(Cat)); var container = builder.Build(); var person = container.Resolve<Person>();
person.Self();
Console.WriteLine("---------");
var animal = container.Resolve<IAnimal>();
animal.Say();
Console.WriteLine("---------");
var cat = container.Resolve<Cat>();
cat.Say();

从图上可以看出, 通过这种方式注册类型之后, 可以正常获取到实例
二、实例注册
示例: (共同部分我就不贴了, 只贴主要部分)
builder.RegisterInstance(new Person(new Dog())); //-------------------------------------------------
var person = container.Resolve<Person>();
person.Self();
person.Say();

这里还有一种为单例模式准备的实现, 可以把单例托管为容器单例, 我这里就没有写那么多了, 直接上了一个非单例的示例. 也是有效果的哟
builder.RegisterInstance(new Cat()).ExternallyOwned(); //-------------------------------------------------
var cat = container.Resolve<Cat>();
cat.Name = "miao";
cat.Say(); var cat1 = container.Resolve<Cat>();
cat1.Say();

这里我后来试了一下, 就算不加那个, 得到的效果也是单例的效果
三、Lambda方式注册
//builder.RegisterType<Dog>().As<IAnimal>();
builder.Register(c => new Person(c.Resolve<IAnimal>()));
builder.RegisterType<Dog>().As<IAnimal>(); //-------------------------------------------------
var person = container.Resolve<Person>();
person.Say();
IAnimal注册的位置不受限制, 在前面, 在后面, 都是不受影响的, 但是不能没有啊, 没有就会报错了, 程序找不到.

四、程序集注册
这种方式适合懒人用
builder.RegisterAssemblyTypes(Assembly.GetExecutingAssembly()).AsImplementedInterfaces(); //-------------------------------------------------
var animal = container.Resolve<IAnimal>();
animal.Say();

我这里面有两个类实现了IAnimal接口, 但是为什么这里获取到的是cat类, 而不是dog类呢?
五、泛型注册
builder.RegisterGeneric(typeof(List<>)).As(typeof(IList<>)).InstancePerLifetimeScope();
var container = builder.Build();
//-------------------------------------------------
IList<Dog> dogs = container.Resolve<IList<Dog>>();
这里获取到的dogs是一个空的集合, 并不是null值.
六、默认注册
如果一个类, 被多次注册, 会以最后一次注册为准, 就想上面 "四" 出现的情况, 只输出了"喵喵喵", 那是因为Dog类先注册, Cat类后注册, 把之前的覆盖掉了. 注意, 覆盖并不是没有了, 只是不能通过这种方式获取了而已, 还是可以通过别的方式来获取你想要的类的.
先看一下效果:
builder.RegisterType<Dog>().As<IAnimal>();
builder.RegisterType<Cat>().As<IAnimal>(); //-------------------------------------------------
var animal = container.Resolve<IAnimal>();
animal.Say();

如果我想要输出Dog类咋搞呢. 使用 PreserveExistingDefaults(), 这个方法是告诉容器, 这次注册的不是默认输出的.
builder.RegisterType<Dog>().As<IAnimal>();
builder.RegisterType<Cat>().As<IAnimal>().PreserveExistingDefaults();
//-------------------------------------------------
var animal = container.Resolve<IAnimal>();
animal.Say();

那如果想一个接口上注册多个类, 并且都能正常获取呢? 那就看下一篇分解了
参考资料:
Autofac - 组件的更多相关文章
- Autofac 组件、服务、自动装配 《第二篇》
一.组件 创建出来的对象需要从组件中来获取,组件的创建有如下4种(延续第一篇的Demo,仅仅变动所贴出的代码)方式: 1.类型创建RegisterType AutoFac能够通过反射检查一个类型,选择 ...
- autofac 组件的实例范围
实例范围决定如何在请求之间共享服务. 原文地址:http://docs.autofac.org/en/latest/lifetime/instance-scope.html 每个依赖一个实例 使用这个 ...
- Autofac 组件、服务、自动装配(2)
一.组件 创建出来的对象需要从组件中来获取,组件的创建有如下4种(延续第一篇的Demo,仅仅变动所贴出的代码)方式: 1.类型创建RegisterType AutoFac能够通过反射检查一个类型,选择 ...
- Autofac 组件、服务、自动装配
一.组件 创建出来的对象需要从组件中来获取,组件的创建有如下4种(延续第一篇的Demo,仅仅变动所贴出的代码)方式: 1.类型创建RegisterType AutoFac能够通过反射检查一个类型,选择 ...
- Autofac官方文档翻译--一、注册组件--4组件扫描
官方文档:http://docs.autofac.org/en/latest/register/scanning.html Autofac 组件扫描 在程序集中Autofac 可以使用约定来找到并注册 ...
- Autofac官方文档翻译--一、注册组件--1注册概念
官方文档:http://docs.autofac.org/en/latest/register/registration.html 一.注册概念 使用Autofac 注册组件,通过创建一个Contai ...
- Autofac - 属性注入
属性注入不同于通过构造函数方式传入参数. 这里是通过注入的方式, 在类创建完毕之后, 资源释放之前, 给属性赋值. 这里, 我重新弄一些类来演示这一篇吧. public class ClassA { ...
- Autofac - 事件
Autofac在提供之前那些方法的时候, 同时提供了五个事件, 这一篇就看一下这几个事件. 一.五大事件 builder.RegisterType<Person>().As<IPer ...
- C#开发微信门户及应用(42)--使用Autofac实现微信接口处理的控制反转处理
在很多情况下,我们利用IOC控制反转可以很方便实现一些接口的适配处理,可以在需要的时候切换不同的接口实现,使用这种方式在调用的时候,只需要知道相应的接口接口,具体调用哪个实现类,可以在配置文件中动态指 ...
随机推荐
- 数据库优化实践【MS SQL优化开篇】
数据库定义: 数据库是依照某种数据模型组织起来并存在二级存储器中的数据集合,此集合具有尽可能不重复,以最优方式为特定组织提供多种应用服务,其数据结构独立于应用程序,对数据的CRUD操作进行统一管理和控 ...
- SVM-非线性支持向量机及SMO算法
SVM-非线性支持向量机及SMO算法 如果您想体验更好的阅读:请戳这里littlefish.top 线性不可分情况 线性可分问题的支持向量机学习方法,对线性不可分训练数据是不适用的,为了满足函数间隔大 ...
- [翻译].NET随机数
原文链接:http://csharpindepth.com/Articles/Chapter12/Random.aspx 随机数 当你在Stack Overflow上看到看到某个问题标题当中有“随 ...
- java基础 数组15
15.找出如下数组中最大的元素和最小的元素, a[][]={{3,2,6},{6,8,2,10},{5},{12,3,23}}
- Atitit图像识别的常用特征大总结attilax大总结
Atitit图像识别的常用特征大总结attilax大总结 1.1. 常用的图像特征有颜色特征.纹理特征.形状特征.空间关系特征. 1 1.2. HOG特征:方向梯度直方图(Histogram of O ...
- Atitit 编程语言原理与概论attilax总结 三大书籍总结
Atitit 编程语言原理与概论attilax总结 三大书籍总结 编程语言原理(第10版) 目录: 第1章 预备知识第2章 主要程序设计语言的发展第3章 描述语法和语义第4章 词法分析和语法分析第5章 ...
- 创建oracle数据库job服务:PlSqlDev操作job
PlSqlDev操作job 创建job 1.选择job文件夹,右键 2.点击新建 3.对应填写完成,可以点击“查看SQL”查看sql语句,确定无误后,点击“应用”即创建完成 4.此时, ...
- MemCached add命令的用法详解
增加: add 往内存增加一条数据 命令格式: add key flag expiretime bytes\r\n data\r\n //跨行所加的一些数据 1)key: 给这个值起一个固定的名字 / ...
- Windows 10 开始菜单修改程序
Windows 10虽然恢复了开始菜单,但与经典的菜单相比还是有些变化.对于菜单项中名称过长的只能显示一部分,比如SQL Server Management Studio这种名称比较长的菜单项名称,常 ...
- CSS默认可继承样式
前面的话 一直想总结出一份可继承样式的列表.常听说,颜色和字体是可继承的,盒模型样式是不可继承的,但其他样式呢?本文内容包括所有可继承的样式 [注意]关于样式的详细信息移步至此 常用可继承样式 col ...