• AutoFac使用方法总结四:生命周期续


         控制反转(IoC/Inverse Of Control):   调用者不再创建被调用者的实例,由autofac框架实现(容器创建)所以称为控制反转。

         依赖注入(DI/Dependence injection) :   容器创建好实例后再注入调用者称为依赖注入。

         AutoFac是一款IOC框架:

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

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

         注入方法一:

    1 var builder = new ContainerBuilder();
    2  
    3 builder.RegisterType<TestService>();
    4 builder.RegisterType<TestDao>().As<ITestDao>();
    5  
    6 return builder.Build();

         注入方法二:

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

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

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

         业务单元操作接口:

    1 /// <summary>
    2 /// 业务单元操作接口
    3 /// </summary>
    4 public interface IUnitOfWork : IDependency
    5 {
    6     ...
    7 }

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

     1 ContainerBuilder builder = new ContainerBuilder();
     2 builder.RegisterGeneric(typeof(Repository<,>)).As(typeof(IRepository<,>));
     3 Type baseType = typeof(IDependency);
     4  
     5 // 获取所有相关类库的程序集
     6 Assembly[] assemblies = ...
     7  
     8 builder.RegisterAssemblyTypes(assemblies)
     9     .Where(type => baseType.IsAssignableFrom(type) && !type.IsAbstract)
    10     .AsImplementedInterfaces().InstancePerLifetimeScope();//InstancePerLifetimeScope 保证对象生命周期基于请求
    11 IContainer container = builder.Build();
    12 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开发。

    转载链接:https://www.cnblogs.com/ingstyle/p/6655883.html

    转载于:https://www.cnblogs.com/supersnowyao/p/8455508.html

  • 相关阅读:
    javascript入门教程笔记
    杭电2025
    杭电 2024
    杭电2019
    UEditor编辑器上传图片开发流程
    js操作textarea方法集合
    ueditor编辑器和at.js集成
    js分页算法
    js获取url中的参数
    第7章函数表达式笔记
  • 原文地址:https://www.cnblogs.com/twodog/p/12137480.html
Copyright © 2020-2023  润新知