ABP提供了在启动时配置模块的基础设施和模型。

1.配置ABP

配置ABP是在模块的PreInitialize方法中完成的,例如:

public class SimpleTaskSystemModule : AbpModule
{
public override void PreInitialize()
{
//添加语言
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")); //添加本地化语言
Configuration.Localization.Sources.Add(
new XmlLocalizationSource(
"SimpleTaskSystem",
HttpContext.Current.Server.MapPath("~/Localization/SimpleTaskSystem")
)
); //配置导航菜单
Configuration.Navigation.Providers.Add<SimpleTaskSystemNavigationProvider>();
} public override void Initialize()
{
IocManager.RegisterAssemblyByConvention(Assembly.GetExecutingAssembly());
}
}

ABP是基于模块设计的。不同的模块都可以配置ABP。例如:不同的模块可以添加导航提供者(navigation providers)往主菜单添加自定义子菜单。

替换内置(Built-In)服务

Configuration.ReplaceService()方法可以覆盖内置服务。例如,你可以用定义实现的类替换IAbpSession服务:

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

ReplaceService()方法通过重载操作以定义方式实现替换(也可以直接使用Castle Windsor高级的注册API)。

同一个服务可以多次被替换,尤其是在不同的模块间。生效的服务是最后被替换的那个。PreInitialize()方法按依赖顺序执行。

2.配置模块

除了ABP框架自身的启动配置外,模块也可以通过扩展IAbpModuleConfigurations接口,为模块提供配置点。

...
using Abp.Web.Configuration;
...
public override void PreInitialize()
{
Configuration.Modules.AbpWebCommon().SendAllExceptionsToClients = true;
}
...

在上述代码中,配置AbpWebCommon模块把所有异常发送给客户端。

不是每个模块都应该定义类似这种类型的配置,通常情况是在不同的应用程序中需要重复使用的才定义,并且要在启动时进行配置。

3.为模块创建配置

假设我们有一个叫MyModule的模块,它带有一些配置属性。首先,为这些配置属性创建一个类:

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

然后在PreInitialize方法中通过DI(Dependency Injection)注册这个类(因此,MyModuleConfig是可注册的类):

IocManager.Register<MyModuleConfig>();

像本事例那样注册为单例对象。那么,我们可以使用如下代码在PreInitialize方法中配置MyModule模块:

Configuration.Get<MyModuleConfig>().SampleConfig1 = false;

然而我们可以类似如下代码,通过创建IModuleConfigurations扩展方法,使用IAbpStartupConfiguration.Get()方法获得引用:

public static class MyModuleConfigurationExtensions
{
public static MyModuleConfig MyModule(this IModuleConfigurations moduleConfigurations)
{
return moduleConfigurations.AbpConfiguration.Get<MyModuleConfig>();
}
}

那么,其它模块可以通过扩展方法配置MyModule模块:

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

这使得查询模块配置和收集它们变得容易(Configuration.Modules...)。ABP本身为它自己的模块配置定义了扩展方法。

在某些地方,MyModule模块需要这些配置,你可以通过构造函数注入并使用配置值。如下:

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

这样,在ABP系统中,模块可以创建集中配置的点。

【ABP框架系列学习】启动配置(5)的更多相关文章

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

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

  2. 【ABP框架系列学习】模块系统(4)

    0.引言 ABP提供了构建模块和通过组合模块以创建应用程序的基础设施.一个模块可以依赖于另外一个模块.通常,程序集可以认为是模块.如果创建多个程序集的应用程序,建议为每个程序集创建模块定义. 当前,模 ...

  3. 【ABP框架系列学习】介绍篇(1)

      0.引言 该系列博文主要在[官方文档]及[tkbSimplest]ABP框架理论研究系列博文的基础上进行总结的,或许大家会质问,别人都已经翻译过了,这不是多此一举吗?原因如下: 1.[tkbSim ...

  4. 【ABP框架系列学习】模块系统(4)之插件示例开发

    0.引言 上一篇博文主要介绍了ABP模块及插件的相关知识,本章节主要开发一个插件示例来学习如何创建一个插件,并在应用程序中使用.这个命名为FirstABPPlugin的插件主要在指定的时间段内删除审计 ...

  5. 【ABP框架系列学习】N层架构(3)

    目录 0.引言 1.DDD分层 2.ABP应用构架模型 客户端应用程序(Client Applications) 表现层(Presentation Layer) 分布式服务层(Distributed ...

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

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

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

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

  8. ABP启动配置

    ABP启动配置   返回ABP系列 ABP是“ASP.NET Boilerplate Project (ASP.NET样板项目)”的简称. ASP.NET Boilerplate是一个用最佳实践和流行 ...

  9. ABP 框架从源码学习——abp框架启动和结束(1)

       1.abp框架的启动是从Global.asax文件的Application_Start启动的,当然代表Global的application必须从AbpWebApplication继承: publ ...

随机推荐

  1. Clinet/Server在工作线程中刷新页面数据的方法

    Worker线程不能修改UI线程的状态(比如文本框里面的内容).解决的办法是写一个用来更新文本框内容的函数,然后在Worker线程里面通过BeginInvoke来利用delegate调用这个函数更新文 ...

  2. form表单内容JSON格式转化

    form表单提交时,对于Content-type为application/json是提交时需要转换成json格式,据说form enctype=‘application/json’这样就可以,然而在我 ...

  3. sui.js和workflow2.js内容详解

    一. 二. var config=$("div[name=lwnf]").sui().getConfig()~var config = this.zoo.getConfig();等 ...

  4. 得到一个文件夹中所有文件的名称的几个方法(命令指示符, C++, python)

    因为最近一直需要获得一个文件下的所有图片的名称,自己又总是跨平台使用,所以把自己在不同环境之下使用的方法总结如下 1.cmd 模式下 优点:简单 例如,我想将一个文件夹下的所有".jpg&q ...

  5. XBee 802.15.4/Digimesh FAQs:如何为2.4G模块选择合适的信道

    XBee 802.15.4模块和XBee Digimesh模块在硬件上完全相同,只是出厂带有不同固件,如果测试需要,这两个固件可以都可以互换烧入模块中. 如何为2.4G模块选择合适的信道 IEEE 8 ...

  6. PS扣签名

    1.用PS打开签名: 2.在图层界面切换到[通道],选择一个黑白分明或者明暗明显的签名图通道.按着“Ctrl”键就会显示出手指和方块的图标,按键的同时左击一下选择的通道: 3.切换到第一项的[图层]界 ...

  7. Ubuntu16.04安装Ambari 2.7.3

    概念了解 Ambair介绍 Apache Ambari是一个用于支持大数据软件供应 管理与监控软件.它也是一个分布式软件,分为Ambair-Server与Ambari-Client两个部分.在生产环境 ...

  8. 数据结构C语言版-队列

    #include <stdlib.h> #include <stdio.h> #include <iostream> using namespace std; ty ...

  9. 解决YUM下Loaded plugins: fastestmirror Determining fastest mirrors 的问题

    Centons下 其大概意思是fastestmirror不能使用,fastestmirror是yum的一个加速插件,具体我也没有仔细了解过,可能是系统不支持或者缺少组建导致的.处理办法就是禁用这个插件 ...

  10. sudo -iu [用户] 命令无法正常切换到用户目录的原因

    今天干活时遇到一个问题,在sudo -iu [用户]命令执行后无法切换到用户对应的[ 用户@机器 ~$ ]命令行 .bashrc已正常配置为 if [ -f /etc/bashrc ]; then . ...