Autofac 学习

之前用Ninject,最近因工作需要开始研究Autofac,其实两者都差不多,只是实现方法上有些区别,原理都一样,下面总结一下基础知识。

Autofac是一款IOC框架,它很轻量级性能非常高。(先吹捧一下,提高学习积极性)

控制反转(IOC  Inverse of Control) 调用者不再创建被调用者的实例,由autofac框架实现(容器创建)所以成为控制反转。比如你用抽象引用(接口或抽象类)指向具体实现类的实例,你要创建实例(这是一个多态的概念),但有了IOC之后,你不用操心这些事了,由IOC框架来干,你只管拿着接口引用来用就成。

依赖注入(DI Dependence  injection) 容器创建好实例后再注入调用者称为依赖注入。 当然,上边你用着是方便了,前提是需要完成框架的一些简单的操作,这些操作就是依赖注入。即建立接口或抽象类与实现之间的关联关系。

安装 Autofac   install-package Autofac

1.关键方法说明

(1)扫描类型 RegisterAssemblyTypes(接受1个或多个程序集的数组),程序集必须是public

   (1.1)过滤类型 Where()

     如:   builder.RegisterAssemblyTypes(Assembly.LoadFile(servicesDllFile))

             .Where(t=>t.Name.EndsWith("Services"))

  (1.2)排除类型 Except()

   如:   builder.RegisterAssemblyTypes(Assembly.LoadFile(servicesDlFile)

             .Except<MyType>(ct=>ct.As<ISpecial>().SingleInstance());

   AsImplementedInterfaces() :表示注册的类型,以接口的方式注册,但不包括IDisposable()接口

   builder.RegisterAssemblyTypes(Assembly.LoadFile(servicesDllFile))

   .Where(t=>t.Name.EndWith("Repository"))

   .AsImplementedInterfaces();

  AsClosedTypesOf(open) 可分配给注册类一个接近开放反省类型的实例

  builder.RegisterAssemblyTypes(Assembly.LoadFile(ServiceDllFile))

  .AsClosedTypesOf(type(IRepository))

  AsSelf  默认,注册类型本身--当重写其他服务默认规范时非常有用

  builder.RegisterAssemblyTypes(Assembly.LoadFile(serviceDllFile))

  .AsImplementedInterfaces()

  .AsSelf();

2.扫描模块 RegisterAssemblyModules()注册方法,它通过Autofac模块提供的程序集扫描,创建模块实例,然后使用当前container builder注册他们,使用

System.Web.Compilation.BuilderManager中的GetReferecedAssemblies()方法,会得到一个引用程序集列表.

var assemblies=BuilderManager.GetReferencedAssemblies().Cast<Assembly>();

注入方法1

var builder=new ContainerBuilder();

builder.RegisterType<TestService>();

builder.RegisterType<TestDAL>().As<ITestDAL>()

return builder.Builder();

方法2 为了统一管理IOC相关代码,并避免在底层类库中到处引用Autofac这个第三方组件,定义了一个专门用于管理需要依赖注入的接口与实现类的空接口IDependency。

    public interface IDependency
    {
    }

这个接口没有任何方法,不会对系统的业务逻辑造成污染,所以需要进行以来注入的接口,都要集成这个空接口。

 

 

 

 

 

  

 

上一篇:01、Assembly--计算机概述


下一篇:C# dotnet 提示找不到 CompositionContainer 类的解决方法