快到年终了, 最近项目比较悠闲, 就想总结下, 项目中所使用到的一些技术, 以及使用方法.

之前有写过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文档

Autofac - 组件的更多相关文章

  1. Autofac 组件、服务、自动装配 《第二篇》

    一.组件 创建出来的对象需要从组件中来获取,组件的创建有如下4种(延续第一篇的Demo,仅仅变动所贴出的代码)方式: 1.类型创建RegisterType AutoFac能够通过反射检查一个类型,选择 ...

  2. autofac 组件的实例范围

    实例范围决定如何在请求之间共享服务. 原文地址:http://docs.autofac.org/en/latest/lifetime/instance-scope.html 每个依赖一个实例 使用这个 ...

  3. Autofac 组件、服务、自动装配(2)

    一.组件 创建出来的对象需要从组件中来获取,组件的创建有如下4种(延续第一篇的Demo,仅仅变动所贴出的代码)方式: 1.类型创建RegisterType AutoFac能够通过反射检查一个类型,选择 ...

  4. Autofac 组件、服务、自动装配

    一.组件 创建出来的对象需要从组件中来获取,组件的创建有如下4种(延续第一篇的Demo,仅仅变动所贴出的代码)方式: 1.类型创建RegisterType AutoFac能够通过反射检查一个类型,选择 ...

  5. Autofac官方文档翻译--一、注册组件--4组件扫描

    官方文档:http://docs.autofac.org/en/latest/register/scanning.html Autofac 组件扫描 在程序集中Autofac 可以使用约定来找到并注册 ...

  6. Autofac官方文档翻译--一、注册组件--1注册概念

    官方文档:http://docs.autofac.org/en/latest/register/registration.html 一.注册概念 使用Autofac 注册组件,通过创建一个Contai ...

  7. Autofac - 属性注入

    属性注入不同于通过构造函数方式传入参数. 这里是通过注入的方式, 在类创建完毕之后, 资源释放之前, 给属性赋值. 这里, 我重新弄一些类来演示这一篇吧. public class ClassA { ...

  8. Autofac - 事件

    Autofac在提供之前那些方法的时候, 同时提供了五个事件, 这一篇就看一下这几个事件. 一.五大事件 builder.RegisterType<Person>().As<IPer ...

  9. C#开发微信门户及应用(42)--使用Autofac实现微信接口处理的控制反转处理

    在很多情况下,我们利用IOC控制反转可以很方便实现一些接口的适配处理,可以在需要的时候切换不同的接口实现,使用这种方式在调用的时候,只需要知道相应的接口接口,具体调用哪个实现类,可以在配置文件中动态指 ...

随机推荐

  1. node(md5)

    md5是一种信息-摘要算法,即针对一段明文给出一个hash值,在密码学中最经典的用法是验证数据的完整性,因为一旦原始数据发生改变那么生成的摘要也必将不同. 网络中md5可以用于用户密码的加密,即在数据 ...

  2. 设计模式之美:Object Pool(对象池)

    索引 意图 结构 参与者 适用性 效果 相关模式 实现 实现方式(一):实现 DatabaseConnectionPool 类. 实现方式(二):使用对象构造方法和预分配方式实现 ObjectPool ...

  3. jenkins + Git 搭建持续集成环境

    持续集成通过自动化构建.自动化测试以及自动化部署加上较高的集成频率保证了开发系统中的问题能迅速被发现和修复,降低了集成失败的风险,使得系统在开发中始终保持在一个稳定健康的集成状态.jenkins是目前 ...

  4. .net开发笔记(十六) 对前部分文章的一些补充和总结

    补充有两个: 一个是系列(五)中讲到的事件编程(网址链接),该文提及到了事件编程的几种方式以及容易引起的一些异常,本文补充“多线程事件编程”这一块. 第二个是前三篇博客中提及到的“泵”结构在编程中的应 ...

  5. winform 通过webservice向服务器提交图片需要注意的地方

    最近一个winform项目中需要通过拍照或者上传本地文件或者截图的方式把产品图片上传到服务器,最后选择了服务器部署webservice的方式来进行.其中遇到了一些问题记录下来. 不多说,直接上服务端代 ...

  6. Redis中统计各种数据大小的方法

    转载于:http://www.itxuexiwang.com/a/shujukujishu/redis/2016/0216/125.html?1455853369如果 MySQL 数据库比较大的话,我 ...

  7. Java-接口练习1

    1.(1)编写一个接口ShapePara,要求: 接口中的方法: int getArea():获得图形的面积.int getCircumference():获得图形的周长 (2)编写一个圆类Circl ...

  8. 我心中的核心组件(可插拔的AOP)~第十五回 我的日志组件Logger.Core(策略,模版方法,工厂,单例等模式的使用)

    回到目录 之前的讲过两篇关于日志组件的文章,分别是<第一回  日志记录组件之自主的Vlog>和<第三回  日志记录组件之log4net>,而今天主要说一下我自己开发的另一种日志 ...

  9. 你可能不知道console强大

    写在前面 大家都有用过各种类型的浏览器,每种浏览器都有自己的特色,本人拙见,在我用过的浏览器当中,我是最喜欢Chrome的,因为它对于调试脚本及前端设计调试都有它比其它浏览器有过之而无不及的地方.可能 ...

  10. JavaScript中this的一些怪异现象

    <!--JavaScript伪协议和内联事件对于this的指向不同--> <a href="#" onclick="alert(this.tagName ...