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

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

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

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

注册页面

admin登录后添加用户页面

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

二、ABP启动配置

配置ABP

 public class SimpleTaskSystemModule : AbpModule
{
public override void PreInitialize()
{
//Add languages for your application
Configuration.Localization.Languages.Add(new LanguageInfo("en", "English", "famfamfam-flag-england", true));
Configuration.Localization.Languages.Add(new LanguageInfo("tr", "Türkçe", "famfamfam-flag-tr")); //Add a localization source
Configuration.Localization.Sources.Add(
new XmlLocalizationSource(
"SimpleTaskSystem",
HttpContext.Current.Server.MapPath("~/Localization/SimpleTaskSystem")
)
); //Configure navigation/menu
Configuration.Navigation.Providers.Add<SimpleTaskSystemNavigationProvider>();
} public override void Initialize()
{
IocManager.RegisterAssemblyByConvention(Assembly.GetExecutingAssembly());
}
}

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

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

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

重写内置服务

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

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访问器。),代表了不同的配置。

        public class MyModuleConfig
{
public bool SampleConfig1 { get; set; } public string SampleConfig2 { get; set; }
}

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

        IocManager.Register<MyModuleConfig>();

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

        public static class MyModuleConfigurationExtensions
{
public static MyModuleConfig MyModule(this IModuleConfigurations moduleConfigurations)
{
return moduleConfigurations.AbpConfiguration
.GetOrCreate("MyModuleConfig",
() => moduleConfigurations.AbpConfiguration.IocManager.Resolve<MyModuleConfig>()
);
}
}

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

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

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

        public class MyService : ITransientDependency
{
private readonly MyModuleConfig _configuration; public MyService(MyModuleConfig configuration)
{
_configuration = configuration;
} public void DoIt()
{
if (_configuration.SampleConfig2 == "test")
{
//...
}
}
}

这意味着,在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注册到容器中。

 IocManager.Register<IAbpWebModuleConfiguration, AbpWebModuleConfiguration>();

3、AbpConfigurationExtension扩展了IModuleConfigurations接口

using Abp.Web.Configuration;

namespace Abp.Configuration.Startup
{
/// <summary>
/// Defines extension methods to <see cref="IModuleConfigurations"/> to allow to configure ABP Web module.
/// </summary>
public static class AbpWebConfigurationExtensions
{
/// <summary>
/// Used to configure ABP Web module.
/// </summary>
public static IAbpWebModuleConfiguration AbpWeb(this IModuleConfigurations configurations)
{
return configurations.AbpConfiguration.GetOrCreate("Modules.Abp.Web", () => configurations.AbpConfiguration.IocManager.Resolve<IAbpWebModuleConfiguration>());
}
}
}

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

namespace Abp.Configuration.Startup
{
internal class ModuleConfigurations : IModuleConfigurations
{
public IAbpStartupConfiguration AbpConfiguration { get; private set; } public ModuleConfigurations(IAbpStartupConfiguration abpConfiguration)
{
AbpConfiguration = abpConfiguration;
}
}
}

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

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. 基于visual Studio2013解决算法导论之017查找第n小元素

     题目 查找第n小元素 解决代码及点评 #include <stdio.h> #include <stdlib.h> #include <malloc.h> ...

  2. ADB logcat 过滤方法(抓取日志)

    1. Log信息级别 Log.v- VERBOSE  : 黑色 Log.d- DEBUG  : 蓝色 Log.i- INFO  : 绿色 Log.w- WARN  : 橙色 Log.e- ERROR ...

  3. Bmp 解析 (2013-09-09 19:30:41)

    bmp 图片结构 位图格式(bmp)是显示图片的基本格式,其文件扩展名为*.BMP. 在Windows下,任何各式的图片文件(包括视频播放)都要转化为位图才能显示出来,其他各种格式的图片文件是在位图格 ...

  4. Python 绝对简明手册

    Python 绝对简明手册 help(函数名)来获取相关信息 另外,自带的文档和google也是不可少的 2. 基本语法2.1. if / elif / else x=int(raw_input(&q ...

  5. 【C# -- OpenCV】Emgu CV 第一个实例

    原文 [C# -- OpenCV]Emgu CV 第一个实例 Emgu CV下载地址 http://sourceforge.net/projects/emgucv/files/ 找最新的下就行了,傻瓜 ...

  6. RTSP调试代码

    #ifdef _WIN32_WCE #include "stdafx.h" #endif #ifndef _WIN32_WCE #define WIN32_LEAN_AND_MEA ...

  7. Revit 2015 API 的全部变化和新功能

    这里从SDK的文章中摘录出全部的API变化.主要是希望用户用搜索引擎时能找到相关信息: Major changes and renovations to the Revit API APIchange ...

  8. Webfrom 生成流水号 组合查询 Repeater中单选与复选控件的使用 JS实战应用

                                             Default.aspx 网页界面 <%@ Page Language="C#" AutoE ...

  9. SilkTest Q&A 13

    Q121 :我想要测试 windows2003 上的 remote 应用,但是每次都得到如下的错误 我想要测试 windows2003 上的 remote 应用,但是每次都得到如下的错误: " ...

  10. 免解压版的Mysql的启动脚本,并且执行导入(windows)

    @echo off rem ################### set MYSQL_VERSION=mysql-5.5.32-win32 set LOCK=wot.lock rem ####### ...