ABP启动配置

 

返回ABP系列

ABP是“ASP.NET Boilerplate Project (ASP.NET样板项目)”的简称。

ASP.NET Boilerplate是一个用最佳实践和流行技术开发现代WEB应用程序的新起点,它旨在成为一个通用的WEB应用程序框架和项目模板。

ABP的官方网站:http://www.aspnetboilerplate.com

ABP官方文档:http://www.aspnetboilerplate.com/Pages/Documents

Github上的开源项目:https://github.com/aspnetboilerplate

一、如何把带zero模块的abp运行起来

今天我们在官网生成模版的页面:http://www.aspnetboilerplate.com/Templates 生成一个带zero模块的abp解决方案。

生成完了后打开,解决目录结构如下:

执行Code First Migrations 两个命令:

Add-Migration “AbpZero_Installed”

Update-Databse

但总是执行失败如下图:

我们注意到 Data Scource 竟然是 .\\SQLEXPRESS 而不是我们想要的 localDB 。 如果我们安装了 SQL Express,那么 database 将会安装在 local SQL Express instance,否则 Code First 才将尝试使用 localDB

最好的解决办法就是默认信任连接字符串换成标准安全连接,问题解决

  1. <connectionStrings>
  2. <add name="Default" connectionString="Data Source =.;Initial Catalog = FirstAbpZero;User Id = sa;Password = 123;" providerName="System.Data.SqlClient" />
  3. </connectionStrings>

运行起来用默认的用户名:admin 密码:123qwe 登录,也可以自己注册一个,但是默认租户要填写default;登录页面

注册页面

admin登录后添加用户页面

虽然运行起来了好像和今天要说的配置关系不大,下面进入正题。

二、ABP启动配置

配置ABP

  1. public class SimpleTaskSystemModule : AbpModule
  2. {
  3. public override void PreInitialize()
  4. {
  5. //Add languages for your application
  6. Configuration.Localization.Languages.Add(new LanguageInfo("en", "English", "famfamfam-flag-england", true));
  7. Configuration.Localization.Languages.Add(new LanguageInfo("tr", "Türkçe", "famfamfam-flag-tr"));
  8.  
  9. //Add a localization source
  10. Configuration.Localization.Sources.Add(
  11. new XmlLocalizationSource(
  12. "SimpleTaskSystem",
  13. HttpContext.Current.Server.MapPath("~/Localization/SimpleTaskSystem")
  14. )
  15. );
  16.  
  17. //Configure navigation/menu
  18. Configuration.Navigation.Providers.Add<SimpleTaskSystemNavigationProvider>();
  19. }
  20.  
  21. public override void Initialize()
  22. {
  23. IocManager.RegisterAssemblyByConvention(Assembly.GetExecutingAssembly());
  24. }
  25. }

abp框架一开始就被设计成模块化的,不同的模块可以通过abp框架来进行配置。举个例子吧,不同的模块都可以添加导航,通过导航添加菜单项到自己定义的主菜单,具体的细节大家可以参照:

本地化:http://www.aspnetboilerplate.com/Pages/Documents/Localization

导航:http://www.aspnetboilerplate.com/Pages/Documents/Navigation

重写内置服务

可以通过Configuration.ReplaceService重写服务,比如可以与您的自定义实现替代iabpsession服务如下图所示:

  1. Configuration.ReplaceService<IAbpSession, MySession>(DependencyLifeStyle.Transient);

replaceservice方法具有过载通过一个自定义的方式进行替换操作。

同样的服务可以被替换多次(特别是在不同的模块)。最后更换将是有效的(你知道,模块分发方法是通过依赖顺序执行)。

配置模块

和.net框架原生的启动配置相比较,abp有哪些不一样呢?abp框架的模块可以通过IAbpModuleConfigurations接口进行个性化的扩展,这样的话,模块配置更加简单、方便。

示例代码如下:

1
2
3
4
5
6
7
8
...
using Abp.Web.Configuration;
...
public override void PreInitialize()
{
    Configuration.Modules.AbpWeb().SendAllExceptionsToClients = true;
}
...

在上面这个例子中,我们通过配置AbpWeb模块,发送异常到客户端。当然了,不是每一个模块都需要这种配置,通常情况下我们需要,是当一个模块需要在多个不同的应用中重复使用,我们才进行这样的配置。

为一个模块创建配置

如下代码,假如我们有一个命名为MyModule的模块,并且这各模块有一些自己的配置。那么我们首先要创建一些类,这些类定义为属性(译者注:属性有自动的get和set访问器。),代表了不同的配置。

  1. public class MyModuleConfig
  2. {
  3. public bool SampleConfig1 { get; set; }
  4.  
  5. public string SampleConfig2 { get; set; }
  6. }

接下来,我们通过依赖注入,注册这个类。

  1. IocManager.Register<MyModuleConfig>();

最后,我们通过创建一个扩展的方法IModuleConfigurations来得到配置的引用。如下代码:

  1. public static class MyModuleConfigurationExtensions
  2. {
  3. public static MyModuleConfig MyModule(this IModuleConfigurations moduleConfigurations)
  4. {
  5. return moduleConfigurations.AbpConfiguration
  6. .GetOrCreate("MyModuleConfig",
  7. () => moduleConfigurations.AbpConfiguration.IocManager.Resolve<MyModuleConfig>()
  8. );
  9. }
  10. }

现在,在其他模块中也可以配置我们自定义的这个MyModule模块了。

  1. Configuration.Modules.MyModule().SampleConfig1 = false;
  2. Configuration.Modules.MyModule().SampleConfig2 = "test";

在某种意义上,MyModule需要这些配置,你能注射MyModuleConfig并且可以使用这些值。

  1. public class MyService : ITransientDependency
  2. {
  3. private readonly MyModuleConfig _configuration;
  4.  
  5. public MyService(MyModuleConfig configuration)
  6. {
  7. _configuration = configuration;
  8. }
  9.  
  10. public void DoIt()
  11. {
  12. if (_configuration.SampleConfig2 == "test")
  13. {
  14. //...
  15. }
  16. }
  17. }

这意味着,在abp框架的系统中,所有的模块都可以集中配置。

三、ABP核心模块配置分析

ABP的配置设计的非常巧妙,通过AbpStartupConfiguration,Castle的依赖注入,Dictionary对象和扩展方法很巧妙的实现了配置中心化。配置中心化是一个支持模块开发的框架必备功能。

ABP中核心功能模块中的一些功能的运行时的行为是依赖于一些外部配置的。所以ABP底层框架通过IAbpStartupConfiguration供外部模块自定义Congfiguration。

ABP初始化阶段就要被实例化的接口都放到了Startup文件夹下

ABP核心功能组件的Configuration实例化过程如下图:

以后需要调用或修改某个组件的Configuration,只要引用其IAbpStartupConfiguration的实例Configuration即可访问各个组件的Configuration了。

四、自定义module的Configuration 实现分析

Abp底层框架知道自己核心功能模块,所以就很自然的给每个核心功能模块各自定义一个Configuration接口。但是Abp底层框架并不知道自定义的module有哪些,所以也就无法给每个自定义的module都创建一个Configuration接口。那么ABP底层框架是怎么管理每个自定义的module的Configuration的呢?

仔细看代码,IAbpStartupConfiguration继承了IDictionaryBasedConfig,DictionaryBasedConfig实现了IDictionaryBasedConfig接口,DictionaryBasedConfig下有个dictionary,这个就是最终保存自定义的module的Configuration的地方,因为Configuration的类型未知,所以dictionary的value是object类型。

下面以AbpWebModule为例讲解

1、AbpWebModule定义了自己的接口IAbpWebModuleConfiguration和AbpWebModuleConfiguration,以及AbpConfigurationExtension

2、在AbpWebModule的preInitialize方法中将接口IAbpWebModuleConfiguration和其实现AbpWebModuleConfiguration注册到容器中。

  1. IocManager.Register<IAbpWebModuleConfiguration, AbpWebModuleConfiguration>();

3、AbpConfigurationExtension扩展了IModuleConfigurations接口

  1. using Abp.Web.Configuration;
  2.  
  3. namespace Abp.Configuration.Startup
  4. {
  5. /// <summary>
  6. /// Defines extension methods to <see cref="IModuleConfigurations"/> to allow to configure ABP Web module.
  7. /// </summary>
  8. public static class AbpWebConfigurationExtensions
  9. {
  10. /// <summary>
  11. /// Used to configure ABP Web module.
  12. /// </summary>
  13. public static IAbpWebModuleConfiguration AbpWeb(this IModuleConfigurations configurations)
  14. {
  15. return configurations.AbpConfiguration.GetOrCreate("Modules.Abp.Web", () => configurations.AbpConfiguration.IocManager.Resolve<IAbpWebModuleConfiguration>());
  16. }
  17. }
  18. }

这个接口是在Abp底层框架中定义和实现的。其属性AbpConfiguration就是AbpStartupConfiguration实例。通过AbpStartupConfiguration的getorCreate方法(具体通过DictionaryBasedConfig来实现)就可以获取到AbpWebModule自定义的AbpWebModuleConfiguration的实例了。

  1. namespace Abp.Configuration.Startup
  2. {
  3. internal class ModuleConfigurations : IModuleConfigurations
  4. {
  5. public IAbpStartupConfiguration AbpConfiguration { get; private set; }
  6.  
  7. public ModuleConfigurations(IAbpStartupConfiguration abpConfiguration)
  8. {
  9. AbpConfiguration = abpConfiguration;
  10. }
  11. }
  12. }

具体访问方式如下,Configuration.Modules就是IModuleConfigurations的实例。通过其扩展方法AbpWeb访问AbpWebModuleConfiguration

  1. Configuration.Modules.AbpWeb.SendAllExceptionsToClients=True;

最后、加关注

ABP启动配置的更多相关文章

  1. ABP(现代ASP.NET样板开发框架)系列之5、ABP启动配置

    点这里进入ABP系列文章总目录 基于DDD的现代ASP.NET开发框架--ABP系列之5.ABP启动配置 ABP是“ASP.NET Boilerplate Project (ASP.NET样板项目)” ...

  2. 基于DDD的.NET开发框架 - ABP启动配置

    返回ABP系列 ABP是“ASP.NET Boilerplate Project (ASP.NET样板项目)”的简称. ASP.NET Boilerplate是一个用最佳实践和流行技术开发现代WEB应 ...

  3. ABP框架 - 启动配置

    文档目录 本节内容: 配置ABP 替换内置服务 配置模块 为一个模块创建配置 ABP在启动时,提供基础框架和模型来配置和模块化. 置ABP 在预初始化事件中进行配置,示例: kid1412注:XmlL ...

  4. ABP理论学习之启动配置

    返回总目录 本篇目录 配置ABP 配置模块 为模块创建配置 为了在应用启动时配置ABP和模块,ABP提供了一个基础设施. 配置ABP 配置ABP是在模块的PreInitialize事件中完成的.下面的 ...

  5. ABP之启动配置

    ASP.NET Boilerplate提供了在StartUp中配置其模块的基础设施和模型. 配置ASP.NET Boilerplate 配置ABP是在模块的PreInitialize 方法中做的,如下 ...

  6. 【ABP框架系列学习】启动配置(5)

    ABP提供了在启动时配置模块的基础设施和模型. 1.配置ABP 配置ABP是在模块的PreInitialize方法中完成的,例如: public class SimpleTaskSystemModul ...

  7. ABP官方文档翻译 1.4 启动配置

    启动配置 配置ABP 替换内置服务 配置模块 创建模块配置 ABP提供了基础设施和模型在启动的时候对它及模块进行配置. 配置ABP 在模块的PreInitialize事件中配置ABP.示例配置如下: ...

  8. ABP模块配置

    介绍 我们知道ABP中模块的配置都是通过模块的Configuration属性来设置的.例如在模块的生命周期方法中可以进行一系列的配置 审计 MQ Redis....也可以替换一些ABP默认配置 通常我 ...

  9. 【推荐】CentOS安装Tomcat-7.0.57+启动配置+安全配置+性能配置

    注:以下所有操作均在CentOS 6.5 x86_64位系统下完成. #准备工作# 在安装Tomcat之前,请确保已经安装了JDK-1.7环境,具体见<CentOS安装JDK-1.7>. ...

随机推荐

  1. 设计模式(八)装饰器模式Decorator(结构型)

    设计模式(八)装饰器模式Decorator(结构型) 1. 概述 若你从事过面向对象开发,实现给一个类或对象增加行为,使用继承机制,这是所有面向对象语言的一个基本特性.如果已经存在的一个类缺少某些方法 ...

  2. HDU 2040:亲和数

    亲和数 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submis ...

  3. PHP - 对象转json - json转数组

    前台js转为json,传给php后台,php后台接收并转为数组. 效果: -- 前台js将对象转为json: var rows = JSON.stringify(rows); 后台php接收转为数组: ...

  4. 改ucosii的中断禁止和恢复代码,这是一个荒谬的错误【 mrs msr】

    ucosii原来的禁止中断以及恢复中断的代码是最简的,但是使用之前,必须声明一个固定名为 OS_CPU_SR   cpu_sr 的变量,吊在那里感觉很怪. ;********************* ...

  5. 2015.7.17( NOI2015 day1 )

    今天早起做了NOI2015网络同步赛.... 最近NOI是越来越向NOIP靠拢了....但是我还是不会做..... 第一题:程序自动分析 先离散化一下..然后最多就剩20w个数 , 不等于就存起来.. ...

  6. JavaScript 字符串编码函数

    JavaScript中有三个可以对字符串编码的函数,分别是: escape,encodeURI,encodeURIComponent,相应3个解码函数:unescape,decodeURI,decod ...

  7. java--内部类实现“类的多重继承”

    class Fa1{ private int k = 1; void show() { System.out.println(k); } } class Fa2{ private int k = 10 ...

  8. Python常用模块中常用内置函数的具体介绍

    Python作为计算机语言中常用的语言,它具有十分强大的功能,但是你知道Python常用模块I的内置模块中常用内置函数都包括哪些具体的函数吗?以下的文章就是对Python常用模块I的内置模块的常用内置 ...

  9. Python中__init__方法介绍

    本文介绍Python中__init__方法的意义.         __init__方法在类的一个对象被建立时,马上运行.这个方法可以用来对你的对象做一些你希望的 初始化 .注意,这个名称的开始和结尾 ...

  10. or1200构建sopc系统之软件环境搭建

    使用预先编译好的工具链 下载: ftp://ocuser:oc@195.67.9.12/toolchain/or32-elf-linux-x86.tar.bz2 解压 tar xjf or32-elf ...