• Autofac


    Autofac是一款IOC框架,比较于其他的IOC框架,如Spring.NET,Unity,Castle等等所包含的,它很轻量级性能上非常高。

    官方网站http://autofac.org/

    源码下载地址https://github.com/autofac/Autofac

    • 控制反转(IoC/Inverse Of Control):   调用者不再创建被调用者的实例,由autofac框架实现(容器创建)所以称为控制反转。
    • 依赖注入(DI/Dependence injection) :   容器创建好实例后再注入调用者称为依赖注入。

    安装Autofac

    Install-Package Autofac

    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(servicesDllFile))
           .Except<myType>(ct =>ct.As<ISpecial>().SingleInstance());
    

      

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

    builder.RegisterAssemblyTypes(Assembly.LoadFile(servicesDllFile))
           .Where(t => t.Name.EndsWith("Repository"))
           .AsImplementedInterfaces();

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

    builder.RegisterAssemblyTypes(Assembly.LoadFile(servicesDllFile))
           .AsClosedTypesOf(typeof(IRepository<>));

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

    builder.RegisterAssemblyTypes(Assembly.LoadFile(servicesDllFile))
           .AsImplementedInterfaces()
           .AsSelf();

     2. 扫描模块 RegisterAssemblyModules() 册方法执行,它的名字是什么,就执行哪个,它通过Autofac 模块提供的程序集扫描,创建模块实例,然后使用当前container builder 注册他们。使用System.Web.Compilation.BuildManager中的GetReferencedAssemblies()方法,会得到一个引用程序集列表,

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

     

    
    

    注入方法一:

    var builder = new ContainerBuilder();
    
    builder.RegisterType<TestService>();
    builder.RegisterType<TestDao>().As<ITestDao>();
    
    return builder.Build();
    

    注入方法二:

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

      /// <summary>
      /// 依赖注入接口,表示该接口的实现类将自动注册到IoC容器中
      /// </summary>
      public interface IDependency
      { }
    

      

    这个接口没有任何方法,不会对系统的业务逻辑造成污染,所有需要进行依赖注入的接口,都要继承这个空接口,例如:

    业务单元操作接口:

    /// <summary>
    /// 业务单元操作接口
    /// </summary>
    public interface IUnitOfWork : IDependency
    {
        ...
    }
    

      Autofac 是支持批量子类注册的,有了 IDependency 这个基接口,我们只需要 Global 中很简单的几行代码,就可以完成整个系统的依赖注入匹配:

    ContainerBuilder builder = new ContainerBuilder();
    builder.RegisterGeneric(typeof(Repository<,>)).As(typeof(IRepository<,>));
    Type baseType = typeof(IDependency);
    
    // 获取所有相关类库的程序集
    Assembly[] assemblies = ...
    
    builder.RegisterAssemblyTypes(assemblies)
        .Where(type => baseType.IsAssignableFrom(type) && !type.IsAbstract)
        .AsImplementedInterfaces().InstancePerLifetimeScope();//InstancePerLifetimeScope 保证对象生命周期基于请求
    IContainer container = builder.Build();
    DependencyResolver.SetResolver(new AutofacDependencyResolver(container));
    

      如此,只有站点主类库需要引用 Autofac,而不是到处都存在着注入的相关代码,大大降低了系统的复杂度。

    1、InstancePerDependency

    对每一个依赖或每一次调用创建一个新的唯一的实例。这也是默认的创建实例的方式。

    2、InstancePerLifetimeScope

    在一个生命周期域中,每一个依赖或调用创建一个单一的共享的实例,且每一个不同的生命周期域,实例是唯一的,不共享的。

    3、InstancePerMatchingLifetimeScope

    在一个做标识的生命周期域中,每一个依赖或调用创建一个单一的共享的实例。打了标识了的生命周期域中的子标识域中可以共享父级域中的实例。若在整个继承层次中没有找到打标识的生命周期域,则会抛出异常:DependencyResolutionException。

    4、InstancePerOwned

    在一个生命周期域中所拥有的实例创建的生命周期中,每一个依赖组件或调用Resolve()方法创建一个单一的共享的实例,并且子生命周期域共享父生命周期域中的实例。若在继承层级中没有发现合适的拥有子实例的生命周期域,则抛出异常:DependencyResolutionException。

    5、SingleInstance

    每一次依赖组件或调用Resolve()方法都会得到一个相同的共享的实例。其实就是单例模式。

    6、InstancePerHttpRequest

    在一次Http请求上下文中,共享一个组件实例。仅适用于asp.net mvc开发。

    参考链接:

    autofac 创建实例方法总结:http://www.cnblogs.com/manglu/p/4115128.html

    AutoFac使用方法总结:Part I:http://niuyi.github.io/blog/2012/04/06/autofac-by-unit-test/

  • 相关阅读:
    背包九讲
    hdu 2602 Bone Collector(01背包)
    hdu 1176 免费馅饼(类似于hdu 2084 数塔那道题目 )
    hdu 1114 PiggyBank(完全背包)
    hdu 2084 数塔
    hdu 1058 Humble Numbers【丑数】
    hdu 1114 PiggyBank【完全背包】
    hdu 2602 Bone Collector (01背包经典入门)
    hdu 2602 Bone Collector【01背包】
    【Python】python的各种函数
  • 原文地址:https://www.cnblogs.com/ingstyle/p/6655883.html
Copyright © 2020-2023  润新知