选项

    ABP框架遵循选项模式,并定义了用于配置框架和模块的选项类(在相关功能文档中有详细的说明).

    由于详细解释了选项模式,本文中只会介绍ABP增加的一些功能.

    通常配置选项在 类的 ConfigureServices 方法中. 但由于ABP框架提供了模块化基础设施,因此你可以在模块ConfigureServices 方法配置选项. 例:

    • AbpAuditingOptions 是一个简单的类,定义了一些属性,例如这里使用的 IsEnabled.
    • AbpModule 基类定义 Configure 方法简化代码. 你可以直接使用 Configure<...>,而不是context.Services.Configure <...>.

    如果你正在开发一个可重用的模块,你可能需要定义一个允许开发人员配置模块的选项类. 这时定义一个如下所示的普通类:

    1. public class MyOptions
    2. {
    3. public int Value1 { get; set; }
    4. public bool Value2 { get; set; }
    5. }

    在你需要获得一个选项值时,将 服务到你的类中,使用它的 .Value 属性得到值. 例:

    1. public class MyService : ITransientDependency
    2. {
    3. private readonly MyOptions _options;
    4. public MyService(IOptions<MyOptions> options)
    5. {
    6. _options = options.Value; //Notice the options.Value usage!
    7. }
    8. public void DoIt()
    9. var v1 = _options.Value1;
    10. var v2 = _options.Value2;
    11. }

    阅读微软文档了解选择模式的所有细节.

    预配置

    选项模式的限制之一是你只能解析(注入) IOptions <MyOptions> 并在依赖注入配置完成(即所有模块的ConfigureServices方法完成)后获取选项值.

    如果你正在开发一个模块,可能需要让开发者能够设置一些选项,并在依赖注入注册阶段使用这些选项. 你可能需要根据选项值配置其他服务或更改依赖注入的注册代码.

    在你的模块中定义预先选项类. 例:

    然后任何依赖于模块的模块类都可以在其 PreConfigureServices 方法中使用 PreConfigure<TOptions> 方法. 例:

    1. public override void PreConfigureServices(ServiceConfigurationContext context)
    2. {
    3. PreConfigure<MyPreOptions>(options =>
    4. {
    5. options.MyValue = true;
    6. });

    最后在你的模块 ConfigureServices 方法中执行 方法来获得配置的选项值. 例: