- Autofac 是一款超赞的.NET IoC 容器 . 它管理类之间的依赖关系, 从而使 应用在规模及复杂性增长的情况下依然可以轻易地修改 .它的实现方式是将常规的.net类当做 组件 处理.
- 引用
- 通过ContainerBuilder来注册组件且告诉容器哪些组件暴露了哪些服务.
-每个组件暴露一个或多个服务 ,他们使用 ContainerBuilder 上的 As() 方法连接起来.
publicvoidRegister(ContainerBuilder builder,ITypeFinder typeFinder) { builder.RegisterType<ConsoleLogger>().As<ILogger>(); //通过类型注册 builder.RegisterType(typeof(ConfigReader)); //实例组件 builder.RegisterInstance(NopEngine).As<IEngine>().SingleInstance(); //Lambda表达式组件 builder.Register(c => new DefaultDapperContext("数据库连接字符串", DataProvider.Mysql)).InstancePerLifetimeScope(); //开放泛型 builder.RegisterGeneric(typeof(NHibernateRepository<>)) .As(typeof(IRepository<>)) .InstancePerLifetimeScope(); //程序集扫描 var dataAccess = Assembly.GetExecutingAssembly(); builder.RegisterAssemblyTypes(dataAccess) .Where(t => t.Name.EndsWith("Repository")) .AsImplementedInterfaces(); }
- 当使用基于反射的组件时, Autofac 自动为你的类从容器中寻找匹配拥有最多参数的构造方法.
- 当使用RegisterType时候,不能注册一个抽象类/接口组件,其中在背后。Autofac其实是创建了一个你注册对象的实例. 你无法 "new up" 一个抽象类或一个接口.
- 实例组件:提前生成一个对象的实例并将它加入容器以供注册组件时使用
- 接收包含一个或多个程序集的数组作为参数. 默认地, 程序中所有具体的类都将被注册. 包括内部类(internal)和嵌套的私有类. 你可以使用LINQ表达式过滤注册的类型集合.
3|0实战
- 在开发过程中我们会遇到很多的注册,如Nop中的类DependencyRegistrar,这里每个组件都要通过这个来进行注册。尤其是一些业务服务,他是不确定的。如果要将其封装起来,这无疑是很庞大和不易管理的。如下:
- 所以我们不如通过程序集的扫描。
首先定义IDependencyRegistrar接口
///<summary> /// 依赖注册接口定义 实现此接口可以使用autofac依赖注入 ///</summary> publicinterfaceIDependencyRegistrar { ///<summary> /// 注册服务或接口 ///</summary> ///<param name="builder">ContainerBuilder对象</param> ///<param name="typeFinder">类型查找器 </param> ///<param name="config">配置参数</param> voidRegister(ContainerBuilder builder, ITypeFinder typeFinder); ///<summary> ///依赖注册执行顺序 从小到大执行 ///</summary> int Order { get; } }
其次,实现接口。
///<summary> /// Dependency registrar ///</summary> publicclassDependencyRegistrar : IDependencyRegistrar { ///<summary> /// Register services and interfaces ///</summary> ///<param name="builder">Container builder</param> ///<param name="typeFinder">Type finder</param> ///<param name="config">Config</param> publicvirtualvoidRegister(ContainerBuilder builder, ITypeFinder typeFinder) { //普通注册 builder.RegisterType<ShipStationService>().As<IShipStationService>().InstancePerLifetimeScope(); //这里通过程序集扫描 builder.RegisterAssemblyTypes(typeFinder.GetAssemblies() .Where(r => RegexHelper.IsMatch(r.GetName().Name,"模式字符串").ToArray()) .Where(t => t.Name.EndsWith("Service")) } ///<summary> /// Order of this dependency registrar implementation ///</summary> publicint Order => 2; }
注册依赖项,这里是通过Activator动态创建类的实例,最后调用其上面的Register方法实现注册
///<summary> /// Register dependencies ///</summary> ///<param name="containerBuilder">Container builder</param> ///<param name="nopConfig">Nop configuration parameters</param> publicvirtualvoidRegisterDependencies(ContainerBuilder containerBuilder, NopConfig nopConfig) { //register engine containerBuilder.RegisterInstance(this).As<IEngine>().SingleInstance(); //register type finder containerBuilder.RegisterInstance(_typeFinder).As<ITypeFinder>().SingleInstance(); //find dependency registrars provided by other assemblies var dependencyRegistrars = _typeFinder.FindClassesOfType<IDependencyRegistrar>(); //create and sort instances of dependency registrars var instances = dependencyRegistrars .Select(dependencyRegistrar => (IDependencyRegistrar)Activator.CreateInstance(dependencyRegistrar)) .OrderBy(dependencyRegistrar => dependencyRegistrar.Order); //register all provided dependencies foreach (var dependencyRegistrar in instances) dependencyRegistrar.Register(containerBuilder, _typeFinder, nopConfig); }
4|0总结:
- 深入了解Autofac,灵活运用就可以了,没有什么特别的知识点,就是要熟练应用。