把Autofac玩的和javaSpring一样6

前言

大家好,今天来介绍我开源的一个autofac.Annotation项目 源码:https://github.com/yuzd/Autofac.Annotation

  • 本项目是autofa的一个扩展组件,autofac是一个老牌的DI容器框架 ,支持netframework和netcore

  • Annotdation是注解的意思,在java项目里面 注解的概念和 csharp里面的 Attribute 的概念是一样的。

项目的目的 

降低玩DI容器的门槛,快速实现依赖注入 自动装配 以及拦截器,AOP切面编程

基于参考 Java的 Spring注解方式开发思想,

所有autofac容器的注册 和 装配 都是依赖标签来完成。

这样一来 一方面很容易分清楚 哪些是DI 哪些非DI, 哪些是拦截器,哪些需要拦截器,轻松实现切面编程, 代码也好看,吸收java的spring框架的优越的地方,配合.net语法的优越性,编程效率能够大大提升。

支持的标签一览

针对每个标签的使用文档 请移步wiki文档传送门

https://github.com/yuzd/Autofac.Annotation/wiki

下面介绍一下最最常用的功能也就是注册和自动装配

Componet标签把类型注册到DI容器

原理解释

框架会扫描打了Componet标签的class。

如果Componet标签里面指定了要注册的类型,则会只注册为这个类型到DI容器。如果没有指定则会把当前class(参考下面的4),以及父类,以及接口都会注册到DI容器(参考下面的1,2和3)。

如何修改这个默认配置呢,比如关闭自动注册父类和接口。 

可以参考 https://github.com/yuzd/Autofac.Annotation/issues/11

Componet有哪些属性

 

Componet的常用构造方法

1、默认的构造方法

//默认的构造方法会把当前class,以及父类,以及接口都会注册到DI容器
//这里只会注册A8到DI容器
[Component]
public class A8
{
}

//通过A8类型可以装配成功
[Autowired]
public A8 A8 { get; set; }
·························································
public class B
{
}
//这里会把A8 和 B 都注册到DI容器
[Component]
public class A8:B
{
}

//通过A8类型可以装配成功
[Autowired]
public A8 A8 { get; set; }

//通过B类型也可以装配成功 拿到的是A8类型
[Autowired]
public B B { get; set; }
··························································
public interface IA
{
}
public interface IB:IA
{
}
public class B:IB
{
}
//这里会把A8  B IB IA 全都注册到DI容器
//如果你指向注册A8 可以参考https://github.com/yuzd/Autofac.Annotation/issues/11 去配置
[Component]
public class A8:B
{
}
//通过A8类型可以装配成功
[Autowired]
public A8 A8 { get; set; }
//通过B类型也可以装配成功 拿到的是A8类型
[Autowired]
public B B { get; set; }
//通过IB类型也可以装配成功 拿到的是A8类型
[Autowired]
public IB IB { get; set; }
//通过IA类型也可以装配成功 拿到的是A8类型
[Autowired]
public IA IA { get; set; }

2、注册为指定类型

public class B
{
}
//这个构造方法就是将A6注册为B类型
[Component(typeof(B))]
public class A6:B
{
}
//可以通过下面的方式自动装配 因为上面注册的是B类型 通过B类型可以装配成功 拿到的是A6类型
[Autowired]
public B B { get; set; }
//通过下面的方式自动装配会失败 会失败 会失败
[Autowired]
public A6 A6 { get; set; }

3、同一个注册类型有多个 采用Key方式解决歧义

public interface ITestAutowiredModal
{
}
// ITestAutowiredModal这个类型被注册多个了 避免歧义用"abc"来解决
[Component("abc")]
public class TestAutowiredModal1:ITestAutowiredModal
{
}
// ITestAutowiredModal这个类型被注册多个了 避免歧义用"def"来解决
[Component("def")]
public class TestAutowiredModal2:ITestAutowiredModal
{
}
//可以用下面的方式来自动装配 拿到的是TestAutowiredModal1类型对象
[Autowired("abc")]
public ITestAutowiredModal TestAutowiredModal1 { get; set; }
//如果不指定的话会先尝试根据byType模式匹配,因为是指定了Key 所以根据byType拿不到,拿不到就会再次根据属性名称 “abc” 去匹配,就和上面的方式一样了
[Autowired]
public ITestAutowiredModal abc { get; set; }
//可以用下面的方式来自动装配 拿到的是TestAutowiredModal2类型对象
[Autowired("def")]
public ITestAutowiredModal TestAutowiredModal2 { get; set; }

1、把一个类型注册到DI容器

上面的例子就是把Student类型注册到容器

2、把当前类型和父类注册到DI容器

上面的例子就是把Student2类型注册到容器

并且把Person类型也注册到容器根据Person类型拿到的是Student2的实体

3、把当前类型和接口注册到DI容器

上面的例子就是把Student3类型注册到容器

并且把ISay也注册到容器根据ISay类型拿到的是Student3的实体

4、当继承了父类或者接口 想要指定注册类型怎么办?

上面的例子就是只能通过ISay拿到Student3的实体

不能通过Student3类型拿到!!

5、怎么指定实例是单例,每次都是新的实例,还是每个Scope一个实例呢?

如上图所示 可以指定AutofacScope属性

如果不指定就是每次获取的一个新的实例

6、当同一个类型多次注册,如何区分得到我想要的?

如上图 ISay类型有2个实现类 Student3 和 Student4 分别指定了 Key的值

通过ISay + “Student3” 可以获取到 Student3的实体

通过ISay + “Student4” 可以获取到 Student4的实体

7、支持注册类型可以自动实例化对象

如上所示,设定AutoActivate = true代表是启动自动实例化

AutofacScope = AutofacScope.SingleInstance 代表单例模式

Student5类型会对象会自动实例化 并且以单例的方式存储在DI容器内

8、支持设置实例化时运行指定方法

如上所示 设置 InitMethod 和 DestroyMethod

当实例从DI容器初始化时就会调用 InitMethod

当DI容器Dispose的时候会触发调用DestroyMethod

另外

  • InitMethod支持注入

  • DestroyMethod只能是无参数方法

Autowired自动装配

Autowired有哪些属性

打在构造方法上 属性

在单例的对象里面Autowired多实例

使用ObjectFactory来实现,和Lazy的区别是 ObjectFactory修饰的每次获取都是从容器里面获取一遍。而Lazy只有首次才会去容器获取。

延迟自动装配Lazy

[Component]
public class TestLazyModel1
{
    [Autowired]
    public Lazy<TestAutowiredModal4> TestAutowiredModal4 {get; set;}
    [Autowired]
    public TestAutowiredModal3 TestAutowiredModal3 { get; set; }
}
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值