SpringBoot的注解注入功能移植到.Net平台(开源)
最近在公司用java和kotlin写接口, 发现SpringBoot的注解来配置DI容器的功能非常的好用: 找了一下发现没有一个net的框架实现了,所以我决定自己写一个!
- 开源地址:https://github.com/yuzd/Autofac.Annotation
- 支持netcore2.0 + framework4.6+
- NUGET安装: Install-Package Autofac.Annotation
这个是我基于autofac框架的一个扩展组件,实现了以下功能:
- Component标签:注册到DI容器直接打上一个即可
- Configuration注解和Bean标签:实现了用实例方法注册到DI容器
- PropertySource和Value标签:实现了注入配置文件属性的值到DI容器
- Autowired标签:实现了自动装配
玩过java的spring框架就应该看这个标签名称很熟悉,因为名称是一模一样的。 功能也是高度保持一致
var builder = new ContainerBuilder(); // 注册autofac打标签模式 builder.RegisterModule(new AutofacAnnotationModule(typeof(AnotationTest).Assembly)); //如果需要开启支持循环注入 //builder.RegisterModule(new AutofacAnnotationModule(typeof(AnotationTest).Assembly).SetAllowCircularDependencies(true)); var container = builder.Build(); var serviceB = container.Resolve<B>();
AutofacAnnotationModule有两种构造方法
- 可以传一个Assebly列表 (这种方式会注册传入的Assebly里面打了标签的类)
- 可以传一个AsseblyName列表 (这种方式是先会根据AsseblyName查找Assebly 然后在注册)
Component标签
说明:只能打在class上面(且不能是抽象class) 把某个类注册到autofac容器 例如:
- 无构造方法的方式 等同于 builder.RegisterType();
//把class A 注册到容器 [Component] public class A { public string Name { get; set; } } //如果 A有父类或者实现了接口 也会自动注册(排除非public的因为autofac不能注册私有类或接口) public interface IB { } public class ParentB:IB { public string Name1 { get; set; } } //把class B 注册到容器 并且把 B作为ParentB注册到容器 并且把B最为IB注册到容器 [Component] public class B:ParentB { public string Name { get; set; } }
- 指定Scope [需要指定AutofacScope属性 如果不指定为则默认为AutofacScope.InstancePerDependency]
[Component(AutofacScope = AutofacScope.SingleInstance)] public class A { public string Name { get; set; } }
- 指定类型注册 等同于 builder.Regist