Autofac依赖注入

简介: Autofac 是一款超赞的.NET IoC 容器 . 它管理类之间的依赖关系, 从而使 应用在规模及复杂性增长的情况下依然可以轻易地修改 .它的实现方式是将常规的.net类当做 组件 处理.
  • Autofac 是一款超赞的.NET IoC 容器 . 它管理类之间的依赖关系, 从而使 应用在规模及复杂性增长的情况下依然可以轻易地修改 .它的实现方式是将常规的.net类当做 组件 处理.
  • 引用
  • image.png
  • 通过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,这里每个组件都要通过这个来进行注册。尤其是一些业务服务,他是不确定的。如果要将其封装起来,这无疑是很庞大和不易管理的。如下:
  • image.png
  • 所以我们不如通过程序集的扫描。
    首先定义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,灵活运用就可以了,没有什么特别的知识点,就是要熟练应用。


相关文章
|
10月前
|
XML Java 数据格式
依赖注入~
依赖注入~
|
10月前
|
Java 测试技术 容器
Spring框架-ObjectProvider更加宽泛的依赖注入
从上面的过程中我们可以看出,但Spring中某个Bean的依赖类型为ObjectProvider时,我们不需要提供一个ObjectProvider类型的Bean到容器中,只需要提供一个T类型的Bean到容器中,容器会自动将其包装成一个ObjectProvider,然后注入到依赖中
136 0
|
设计模式 Java Spring
|
Java Maven
SpringFrame-ioc 依赖注入
SpringFrame-ioc 依赖注入
|
SQL 开发框架 安全
3.1依赖注入
传统开发中,对象都是开发者创建组装,开发者必须了解各类的使用方法且某些类的耦合度较高,例如想把sql serve数据库改为MySql数据库则需要更改某些代码。控制反转的目的是让框架完成对象的创建和组装。从“我创建对象”编程“我要对象”
|
Java 程序员 数据库
依赖注入IOC
依赖注入IOC
|
XML 架构师 关系型数据库
依赖注入-1
这里不在介绍依赖注入的基本概念,这里网上/官网上面有很多。
138 0
|
测试技术
什么是依赖注入
依赖注入的四种方法介绍。