Reface.AppStarter 是一种基于 .NetFramework 的应用程序启动模式,使用该启动模式,你可以轻松的得到以下功能 :

  • IOC / DI 自动注册与装配
  • 简化配置
  • 垂直模块化你的代码
  • 事件总线功能
  • 命令总线 功能
  • 定义模块的依赖项
  • 对模块内的类型进行扫描并分类管理

1 安装

通过 Nuget 你可以很轻松的安装并使用它。

2 设计理念

2.1 模块化

模块是系统组成的最小颗粒,

每一个模块都应当向系统提供一个单一的功能或业务,比如 Excel导出,缓存,用户管理等等。

原则上,我们建议你的每一个 Library 都是一个模块。

在 Reface.AppStarter 中,每一个模块都应当申明一个 AppModule 作为提供给外部依赖的类型。

public class MyAppModule : AppModule
{
}

2.2 模块依赖

模块与模块之间存在依赖关系,

如上图,启动模块依赖模块A,启动模块就可以得到模块A中的功能,模块A也可以增加启动模块的功能。

整个系统只能有一个启动模块,由它作为 ROOT 向下展开。

例如

一个用户模块可能依赖 Excel导入导出、日志、缓存模块,一个缓存模块可能依赖 AOP、日志模块等等。

在 Reface.AppStarter 中,当 A 模块依赖 B 模块时,我们把 B 称作为的 DependentModule,将 A 称作 B 的 TargetModule,

我们可以利用 Attribute 轻松的实现模块依赖的定义,下面的例子就是一个依赖了 用户、订单 的模块。

[UserAppModule]
[OrderAppModule]
public class MyAppModule
{
}

2.3 类型扫描与分类

当我们使用模块以树状的形式构建了系统后,

Reface.AppStarter 就可以对这个树状图中的模块进行自顶向下的扫描,

扫描每一个模块中的类型,并将一切标有 ScannableAttribute(或继承) 特征的类型收集,允许被依赖的模块访问这些被收集的类型,并对这些类型进行增强的操作。

[Scannable]
public class MyClass
{
}

形如上面的类型,就可以被依赖的 AppModule 获取,并对其做出额外的增强,比如 IOC / DI ,AOP的代理类生成等等。

Reface.AppStarter 所提供的 IOC / DI 的自动注册和自动装置就是基于此功能实现的。

2.4 应用程序构建

Reface.AppStarter 分为配置与启动两个阶段。

配置阶段你需要声明一个 AppSetup ,并让它启动你的取顶层模块即可。

AppSetup setup = new AppSetup();
App app = setup.Start(new MyAppModule());

App 实例承载了 Reface.AppStarter 中的所有容器,有关容器会在以后的文章中做详解。

最简单的用法,是从 app 中得到 IComponentContainer 并用它创建 IOC / DI 组件。

var container = app.GetAppContainer<IComponentContainer>();
ITestService service = container.CreateComponent<ITestService>();
service.Do();

3 使用方法

3.1 为你的所有 Library 创建 AppModule

  • 你可以通过 AppModule 实现以下功能
  • 创建一个可以由外部依赖的 AppModule
  • 定义自己所依赖的其它 AppModule
  • 增强依赖自己的 TargetModule 的功能
  • 注册额外的组件至 IOC / DI 容器
  • 替换  IOC / DI 容器中已注册的组件

下面的示例中展示了上述所的大部分常用功能

    [AutoConfigAppModule]
[ComponentScanAppModule]
[UserAppModule]
public class TestAppModule : AppModule
{
[ComponentCreator]
public IUserService GetUserService(ILangProvider provider)
{
return new DefaultUserService(provider);
} [ReplaceCreator]
public ITestService GetTestService()
{
return new SecondTestService();
}
}

代码解释

  • 所有  AppModule 都要实现 IAppModule 的接口,IAppModule 的一个简便的实现就是 AppModule,它允许开发者直接通过 Attribute 来定义依赖项
  • 通过 Attribute,TestAppModule 依赖了三个其它模块
    • AppConfigAppModule,是一个自动配置模块,这是 Reface.AppStarter 自带的
    • ComponentScanAppModule,是一个 IOC / DI 组件扫描的模块,这也是 Reface.AppStarter 自带的
    • UserAppModule,这是一个关于用户的业务模块,这是一个示例模块
  • 标记了 ComponentCreator 的方法会将 DefaultUserService 注册到 IUserService 上,并使用 IOC / DI 中已注册的 ILangProvider 作为构造函数
  • 标记了 ReplaceCreator 的方法会将 IOC / DI 中已有的 ITestService 替换,并重新使用 SecondTestService 进行注册

3.2 为你的类型加上 Component 让他们自动注册到 IOC / DI 容器中

市面上有很多方便的 IOC / DI 工具库,但他们总是依赖手动注册。

即使我们通过反射程序集,也很难做到对系统中所有有需要的程序集做反射 ( 我们肯定不会对 System 这种库进行反射注册的 )。

但是通过 AppModule 以及对 ComponentScanAppModule 的依赖,我们可以很清楚的知道哪些程序集是需要进行反射注册的。

AppSetup 会执行这些操作,

而开发者们只需要为你们的类型加上 Component 特征即可

[Component]
public class DefaultUserService : IUserService
{
}

注册方法有两种,通过 Component 的构造函数区分。

  • 注册为接口。在组件创建时,你必须使用接口类型进行创建
  • 注册为类型本身。在组件创建时,你必须使用类型进行创建

你也可以同时注册为接口和其本身。

3.3 编写你的配置类

.Net 自带的 config 配置很好用,但是太臃肿,要写大量的映射类。

Reface.AppStarter 简化这些复杂的过程,它只要你写一个配置类,然后再通过一个 json 反序列化就可以了。

3.3.1 编写一个配置类

任何数据结构你都可以直接当作配置类,不需要继承任何类,只要为其加上 Config 特征即可

[Config("DbConnection")]
public class DbConnectionConfig
{
public string ConnectionString { get; set; }
}

3.3.2 编写配制文件

默认的配置文件路径是启动目录下的 app.json,

所有标有 Config 特征的类都会从这里读取配置

Config 中构造函数所要提供的字符串,就是配置文件中的 属性 名称

{
"DbConnection" : {
"ConnectionString" : "Your Connection String Here"
}
}

3.3.3 在该模块中添加对自动配置的依赖

为你的 AppModule 添加特征 AutoConfigAppModule 即可。

[AutoConfigAppModule]
public class MyAppModule
{
}

3.3.4 自定义配置文件路径

AppSetup 的构造函数中有一个参数,该参数就是配置文件的路径,你可以在 new AppSetup 的时候,指定一个新的配置文件路径。

3.3.5 使用配置

标有了 [Config] 的类型会以其自身的类型注册到 IOC / DI 容器中,

因此,你可以通过 IOC / DI 的容器的自动装配功能得到它的实例。

[Component]
public class DefaultTestService
{
private readonly DbConnectionConfig config; public DefaultTestService(DbConnectionConfig config)
{
this.cofnig = config;
}
}

4 系统中的 Attribute

4.1 ScannableAttribute

标记了该特征的类型将会在扫描时被记录,

就如它的名字一样,它只表达一种允许被扫描的用意,没有其它任何含义,

当你需要对某些类型进行分类时,请创建更有意义的特征,并继承此特征。

4.2 ComponenAttribute

标记了该特征的类型会被注册到 IOC / DI 容器中

4.3 ConfigAttribute

标记了该特征的类会从配置文件中进行反序列化,并以类型本身注册到 IOC / DI 容器中

4.4 ListenerAttribute

标记了该特征的类会成为一个事件总线的监听器

4.5 CommandHandlerAttribute

标记了该特征的类会成为一个命令总线的命令处理器

4.6 ComponentCreatorAttribute

在 AppModule 中,被标记了该特征的方法会将以方法的构建过程注册到 IOC / DI 容器中

4.7 ReplacCreatorAttribute

在 AppModule 中,被标记了该特征的方法会移除当前 IOC / DI 容器中的组件并重新注册,

在一次构建中,同一个组件只可以被替换一次

5 系统中的 AppModule

5.1 ComponenScanAppModule

该模块会将目标模块中所有标记了 ComponentAttribute 的组件注册到 IOC / DI 容器中

5.2 AutoConfigAppModule

该模块会将配置文件中的类型反序列化到目标模块中标记了 ConfigAttribute 的类型上,并注册到 IOC / DI 容器中


后面的文章

  • 如何使用事件总线
  • 如何使用命令总线
  • 如何编写功能性 AppModule
  • 什么是 AppContainer 

相关链接

本文为作者原创,转载请注明出处 : https://www.cnblogs.com/ShimizuShiori/p/12610668.html

Reface.AppStarter 框架初探的更多相关文章

  1. Reface.AppStarter 类型扫描 —— 获得系统中所有的实体类型

    类型扫描 是 Reface.AppStarter 提供的最基本.最核心的功能. AutoConfig , ComponentScan 等功能都是基于该功能完成的. 每一个使用 Reface.AppSt ...

  2. 开发指南专题二:JEECG微云高速开发平台JEECG框架初探

    开发指南专题二:JEECG微云高速开发平台JEECG框架初探 2.JEECG框架初探 2.1演示系统 打开浏览器输入JEECG演示环境界址:http://demo.jeecg.org:8090/能够看 ...

  3. django框架初探

    django框架初探 1.web框架介绍 web框架本质是一个socket服务端.每一个端口只能被一个程序监听. web程序分为两个部分: 服务器程序:对socket服务器封装,解析http请求,发送 ...

  4. Reface.AppStarter 基本示例

    Reface.AppStarter 向应用层提供以下几项 核心 功能 以模块化组织你的应用程序 自动注册组件至 IOC 容器 自动映射配置文件至配置类 在模块定义类中额外追加组件至 IOC 容器 在模 ...

  5. MVVMLight学习笔记(二)---MVVMLight框架初探

    一.MVVM分层概述 MVVM中,各个部分的职责如下: Model:负责数据实体的结构处理,与ViewModel进行交互: View:负责界面显示,与ViewModel进行数据和命令的交互: View ...

  6. 从壹开始前后端分离 [ vue + .netcore 补充教程 ] 二七║ Nuxt 基础:框架初探

    缘起 哈喽大家好,又是周四了,俗话说周四来了,周末还远么哈哈,老张我也想下周请假,来个16天的大长假哟,不知道大家是怎么请假的,近来发现文章下边已经没有人评论了,赶脚比较凄凉了,大家看到的麻烦点个赞呀 ...

  7. 轻量级ORM框架初探-Dapper与PetaPoco的基本使用

    一.EntityFramework EF是传统的ORM框架,也是一个比较重量级的ORM框架.这里仍然使用EF的原因在于为了突出轻量级ORM框架的性能,所谓有对比才有更优的选择. 1.1 准备一张数据库 ...

  8. CI框架初探

    2014年7月3日 17:39:35 简易版: index.php->codeIgniter.php->找到控制器类文件并include->创建实例->执行成员函数 详细版本: ...

  9. Java之Structs框架初探

    今天是小白第一次自己的接触Struts框架,因为网上的资料都是从Structs2开始,跟Structs1完全不同,因此,小白直接跳过1学习版本2的搭建,废话不多说,直接开始. 首先要搭建框架,就肯定要 ...

随机推荐

  1. [红日安全]Web安全Day8 - XXE实战攻防

    本文由红日安全成员: ruanruan 编写,如有不当,还望斧正. 大家好,我们是红日安全-Web安全攻防小组.此项目是关于Web安全的系列文章分享,还包含一个HTB靶场供大家练习,我们给这个项目起了 ...

  2. 7-36 jmu-python-统计字符个数 (10 分)

    输入一个字符串,统计其中数字字符及小写字符的个数 输入格式: 输入一行字符串 输出格式: 共有?个数字,?个小写字符,?填入对应数量 输入样例: helo134ss12 输出样例: 共有5个数字,6个 ...

  3. 手摸手教你在vue-cli里面使用vuex,以及vuex简介

    写在前面: 这篇文章是在vue-cli里面使用vuex的一个极简demo,附带一些vuex的简单介绍.有需要的朋友可以做一下参考,喜欢的可以点波赞,或者关注一下,希望可以帮到大家. 本文首发于我的个人 ...

  4. 零基础HTML及CSS编码总结

    任务目的 针对设计稿样式进行合理的HTML架构,包括以下但不限于: * 掌握常用HTML标签的含义.用法 能够基于设计稿来合理规划HTML文档结构 理解语义化,合理地使用HTML标签来构建页面 掌握基 ...

  5. ES6语法:var、let、const的区别详解

    今天来说说es6的语法,最基础的也就是var,let,const 的用法与区别了,我们来看看他们之间的恩怨情仇. 首先来说说var,这个只要是学过js的都知道,它是用来声明一个变量的,但是它在开发中也 ...

  6. Core + Vue 后台管理基础框架3——后端授权

    1.前言 但凡业务系统,授权是绕不开的一环.见过太多只在前端做菜单及按钮显隐控制,但后端裸奔的,觉着前端看不到,系统就安全,掩耳盗铃也好,自欺欺人也罢,这里不做评论.在.NET CORE中,也见过不少 ...

  7. flask 模型一对多个人理解

    在modle中创建两个模型表 class User(db.Model): id = db.Column(db.Integer,primary_key=True,autoincrement=True) ...

  8. MySQL/InnoDB中的事务隔离级别

    SQL标准中的事务四种隔离级别 隔离级别 脏读(Dirty Read) 不可重复读(NonRepeatable Read) 幻读(Phantom Read) 未提交读(Read uncommitted ...

  9. 【Python】2.16学习笔记 运算符,位运算符,if-else语句

    复合运算符 a *= b # a = a * b a += b # a = a + b a -= b # a = a - b ... 位运算符 对数字进行二进制运算 按位与 &,二进制位都为一 ...

  10. Vue 学习记录(一)

    Vue 研究了一段时间,要学的东西挺多的. 一.基本指令 1.v-text:2.v-html:3.v-pre;4.v-cloak:5.v-once:6.v-if:7.v-else:8.v-else-i ...