📚
Hoa Framework
  • 一、框架指南
  • 二、功能特性
  • 三、源码结构
  • 四、代码规范
  • 五、入门指南
  • 六、依赖注入/控制反转
  • 七、控制器和服务
  • 八、对象映射指南
  • 九、数据库操作指南
    • 9.1、正向工程(Code First)
    • 9.2、逆向工程(Database First)
    • 9.3、关于仓储(IRepository)
    • 9.4、增删改操作
    • 9.5、查询操作
    • 9.6、DataSet、DataTable 操作
    • 9.7、查询结果集映射
    • 9.8、批量增删改操作
    • 9.9、存储过程、视图、函数操作
    • 9.10、工作单元和事务
    • 9.11、多上下文、读写分离
    • 9.12、切面上下文(TangentDbContext)
    • 9.13、其他操作
    • 9.14、EF Core 高性能
    • 9.15、常见错误
  • 十、开放接口指南
    • 10.1、RESTFul 和 Swagger
    • 10.2、规范化返回值
  • 十一、数据校验
  • 十二、安全授权
  • 十三、异常处理
  • 十四、日志管理
  • 十五、配置管理
  • 十六、缓存管理
  • 十七、内置工具类
    • 17.1、数据加解密
  • 十八、跨域处理
  • 十九、筛选拦截器(未)
  • 二十、进程服务(Daemon)
  • 二十一、编写测试
    • 20.1、单元测试
    • 20.2、基准测试
    • 20.3、性能测试
  • 二十二、托管部署
    • 22.1、IIS 托管部署
    • 22.2、Nginx 托管部署
    • 22.3、Docker 容器部署
  • 二十三、性能分析(MiniProfiler)
  • 二十四、其他功能
    • 23.1、第三方包管理
    • 23.2、文件上传下载
    • 23.3、Razor 视图引擎
    • 23.4、生成客户端请求代码
    • 23.5、快捷操作
  • 二十五、Docker 容器化
    • 25.1、Docker 介绍
    • 25.2、Docker 安装
    • 25.3、Docker 安装服务
    • 25.4、Docker 常用命令
    • 25.6、Docker run 常用命令
    • 25.7、Docker-Compose 介绍
    • 25.8、docker-compose.yml
    • 25.9、Docker-Compose 常用命令
    • 25.10、Docker-Compose 转换 docker run
    • 25.11、Docker 构建自己的镜像
    • 25.12、Dockerfile指南
    • 25.13、Dockerfile 常用命令
    • 25.14、Dockerfile 打包、上传、分享
    • 25.15、Docker 数据卷
    • 25.16、Docker 域网络
    • 25.17、Docker + Nginx 实现分布式集群、负载均衡
  • 二十六、DevOps 持续部署集成
    • 26.1、DevOps 介绍
    • 26.2、持续集成、交付、部署
    • 26.3、Jenkins 介绍
    • 26.4、Jenkins 安装
    • 26.5、Jenkins 初始化
    • 26.6、Jenkins 实战演练
    • 26.7、Jenkis 项目配置
    • 26.8、Jenkins 插件
  • 二十七、OpenXml/Excel 操作
  • 二十八、SaaS 多租户
  • 二十九、Git 代码管理
    • 29.1、Git 介绍
    • 29.2、Git 安装
    • 29.3、Git 基础配置
    • 29.4、Git 工作流程
    • 29.5、Git 重要概念
    • 29.6、Git 创建仓库
    • 29.7、Git 基本操作
    • 29.8、Git 分支管理
    • 29.9、Git 查看提交历史
    • 29.10、Git 标签
    • 29.11、Git 拉取/获取/推送
    • 28.12、Git GUI工具
    • 29.13、Git 私有化部署
    • 29.14、Git 推荐开发模式
    • 29.15、Svn 转 Git
  • 贡献代码
  • 更新日志
由 GitBook 提供支持
在本页
  • 依赖注入(IOC)
  • 控制反转(DI)
  • 应用场景
  • 框架内置依赖注入契约
  • 简易方式
  • 强大的 Autofac 配置契约
  • .NET Core 自带依赖注入锲约
  • 关于生命周期

这有帮助吗?

六、依赖注入/控制反转

在现代化的应用程序中,依赖注入/控制反转已经成为框架底层不可或缺的组件/模式。

依赖注入(IOC)

通俗来说,就是把有依赖关系的类放到容器中,然后在我们需要这些类时,容器自动解析出这些类的实例,这就是依赖注入。也就是程序员无需自己创建一个服务对象类,而是将该服务对象类以某种锲约(通常时接口)配置到容器中,然后容器根据这些锲约定位到对象类并创建出来。

依赖注入最大的好处时实现类的解耦,利于程序拓展、单元测试、自动化模拟测试等。

控制反转(DI)

控制反转只是一个概念,也就是将创建对象实例的控制权(原本是程序员)从代码控制权剥离到 IOC容器中控制。也就是上面 依赖注入(IOC)创建对象的过程描述。

要想接口实现构造函数注入方式创建对象,则实例类需继承或间接继承 ITransientDependency 接口,如:

应用场景

在现代化的应用程序中,依赖注入/控制反转已经成为框架底层不可或缺的组件/模式,这种模式最显著的应用就是面向接口编程,所有的服务/类都必须抽象出接口规范,并且所有的服务/类之间的调用都是通过接口调用。

默认情况下,所有的服务/类需要调用第三方或自定义的服务/类都是通过实例类构造函数进行申明注入的。

IOC容器会托管我们所有注册的服务/类,在这个服务/类被创建的时候,会扫描构造函数的参数,并动态创建这些依赖服务/类对象并赋值给页面私有只读变量中。

如下面代码:

using System;

namespace Hoa.Application.SomeModule
{
    public class SomeAppService : ISomeAppService, ITransientDependency // 继承 ITransientDependency 接口
    {
    }
}

AuthorizationAppService 构造函数中申明了 ISomeAppService 接口,这时,当 IAuthorizationAppService 接口被调用时,会自动注入 ISomeAppService` 接口实例。

using System;

namespace Hoa.Application.Authorization
{
    public class AuthorizationAppService : IAuthorizationAppService, IAppServiceDependency
    {
        // 构造函数注入
        private readonly ISomeAppService _someService;
        public AuthorizationAppService(ISomeAppService someService)
        {
            _someService_ = someService;
        }
    }
}

框架内置依赖注入契约

简易方式

在 Hoa Framework 框架中,提供一种更加建议的契约方式,只需要接口的实现类直接或间接继承 ITransientDependency 或 IScopeDependency即可。

Hoa Framework 框架默认继承了 Autofac 依赖注入/控制反转组件,需手动配置锲约只需要在 各个项目层根目录下带 项目层名称Module.cs 文件中配置即可,如:HoaModule.cs

using Autofac;
using Autofac.Extras.DynamicProxy;
using Hoa.Dependencies;
using Hoa.Interceptors;
using System.Linq;

namespace Hoa
{
    public class HoaModule : Module
    {
        protected override void Load(ContainerBuilder builder)
        {
            var registrationBuilder = builder.RegisterAssemblyTypes(AppGlobal.ApplicationAssembiles).PublicOnly()
                   .Where(type => typeof(ITransientDependency).IsAssignableFrom(type))
                   .AsImplementedInterfaces()
                   .InstancePerLifetimeScope();

            if (AppGlobal.AppConfigOptions.EnableGlobalPerformanceAnalysis)
            {
                builder.RegisterType<HoaPerformanceAnalysisInterceptor>().AsSelf();
                registrationBuilder.EnableInterfaceInterceptors().InterceptedBy(typeof(HoaPerformanceAnalysisInterceptor));
            }
        }
    }
}

.NET Core 自带依赖注入锲约

关于生命周期

Hoa Framework框架中集成了Autofac 和默认的.NET Core 依赖注入组件,也就是我们可以通过各自提供的方式去控制服务的生命周期。

为了避免常态下手动指定服务生命周期,框架提供了ITransientDependency或IScopeDependency两个依赖接口。

如果服务直接或间接继承 ITransientDependency,生命周期为 瞬时 的,也就是只要使用就会创建新对象。

如果服务直接或间接继承 IScopeDependency,生命周期为 基于请求 的,也就是整个请求只有一个对象。

上一页五、入门指南下一页七、控制器和服务

最后更新于4年前

这有帮助吗?

强大的 配置契约

更多 配置可查看

可查阅

更多关于生命周期。

Autofac
Autofac
官方文档
.NET Core 依赖注入官方文档
可查阅官方文档