ABP启动配置
鲁滨逊历险记ABP是“ASP Boilerplate Project (ASP样板项⽬)”的简称。
ASP Boilerplate是⼀个⽤最佳实践和流⾏技术开发现代WEB应⽤程序的新起点,它旨在成为⼀个通⽤的WEB应⽤程序框架和项⽬模板。⼀、如何把带zero模块的abp运⾏起来
⽣成完了后打开,解决⽬录结构如下:
执⾏Code First Migrations 两个命令:
Add-Migration “AbpZero_Installed”
Update-Datab
但总是执⾏失败如下图:
我们注意到Data Scource竟然是.\\SQLEXPRESS⽽不是我们想要的 localDB。如果我们安装了SQL Express,那么databa 将会安装在 local SQL Express instance,否则 Code First 才将尝试使⽤localDB。
最好的解决办法就是默认信任连接字符串换成标准安全连接,问题解决
<connectionStrings>
<add name="Default" connectionString="Data Source =.;Initial Catalog = FirstAbpZero;Ur 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.RegisterAsmblyByConvention(Asmbly.GetExecutingAsmbly());
}
}
abp框架⼀开始就被设计成模块化的,不同的模块可以通过abp框架来进⾏配置。举个例⼦吧,不同的模块都可以添加导航,通过导航添加菜单项到⾃⼰定义的主菜单,具体的细节⼤家可以参照:
重写内置服务
可以通过Configuration.ReplaceService重写服务,⽐如可以与您的⾃定义实现替代iabpssion服务如下图所⽰:
Configuration.ReplaceService<IAbpSession, MySession>(DependencyLifeStyle.Transient);
replacervice⽅法具有过载通过⼀个⾃定义的⽅式进⾏替换操作。
梦见和领导吵架
同样的服务可以被替换多次(特别是在不同的模块)。最后更换将是有效的(你知道,模块分发⽅法是通过依赖顺序执⾏)。
配置模块
和框架原⽣的启动配置相⽐较,abp有哪些不⼀样呢?abp框架的模块可以通过IAbpModuleConfigurations接⼝进⾏个性化的扩展,这样的话,模块配置更加简单、⽅便。
⽰例代码如下:
1 2 3 4 5 6
using Abp.Web.Configuration;
...
public override void PreInitialize()
{
Configuration.Modules.AbpWeb().SendAllExceptionsToClients = true; }
猫咪呕吐
...
在上⾯这个例⼦中,我们通过配置AbpWeb模块,发送异常到客户端。当然了,不是每⼀个模块都需要这种配置,通常情况下我们需要,是当⼀个模块需要在多个不同的应⽤中重复使⽤,我们才进⾏这
样的配置。
为⼀个模块创建配置
如下代码,假如我们有⼀个命名为MyModule的模块,并且这各模块有⼀些⾃⼰的配置。那么我们⾸先要创建⼀些类,这些类定义为属性(译者注:属性有⾃动的get和t访问器。),代表了不同的配置。
public class MyModuleConfig
{
public bool SampleConfig1 { get; t; }
public string SampleConfig2 { get; t; }
}
接下来,我们通过依赖注⼊,注册这个类。
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 = fal;
Configuration.Modules.MyModule().SampleConfig2 = "test";
在某种意义上,MyModule需要这些配置,你能注射MyModuleConfig并且可以使⽤这些值。
在全民k歌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了。