zoukankan      html  css  js  c++  java
  • 【ABP框架系列学习】启动配置(5)

    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系统中,模块可以创建集中配置的点。

  • 相关阅读:
    Intern Day15
    Intern Day15
    Intern Day15
    Intern Day15
    Intern Day15
    Intern Day14
    Intern Day14
    纯CSS序列号
    屌丝、高富帅、文艺青年、土豪的区别
    什么是文艺
  • 原文地址:https://www.cnblogs.com/OlderGiser/p/10035819.html
Copyright © 2011-2022 走看看