如何动态加载Autofac配置进行初始化

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何动态加载Autofac配置进行初始化相关的知识,希望对你有一定的参考价值。

我有两种执行程序(控制台)的方法,作为客户端调用服务或作为服务器调用自己的本地服务。第一种方式是Autofac初始化非常快,因为只注册两个模块,服务器方式较慢,因为Autofac必须初始化所有服务器模块(超过1分钟)。执行方式取决于控制台的参数。

等待更好的解决方案我已经在控制台模块上实现了它,在必要时加载服务器模块,但它有点硬编码(从文件中提取模块和配置/属性),因为我已经将它们配置为混合文件和模块(以下示例)我会保留文件的配置。

我想动态选择文件:

<autofac configSource="autofac-client.config" />

要么

<autofac configSource="autofac-server.config" />

码:

autofac-client.config:

<autofac defaultAssembly="Console1">
    <files>
        <file name=".BaseSettingsClientServices.config" section="clientServices" />
    </files>
    <modules>
        <module type="Console1.AutofacModules.ComponentModule, Console1" />
    </modules>
</autofac>

autofac-server.config:

<autofac defaultAssembly="Console1">
    <files>
        <file name=".BaseSettingsClientServices.config" section="clientServices" />
        <file name=".BaseSettingsAutofacRegistrationModules.config" section="AutofacRegistrationModules" />
    </files>
    <modules>
        <module type="assembly1.AutofacModules.ComponentModule, assembly1" />
        <module type="assembly2.AutofacModules.PrintManagerModule, assembly2" />
        <module type="assembly3.AutofacModules.ComponentModule, assembly3" />
        <module type="assembly4.AutofacModules.FormEngineServicesComponentModule, assembly4" />
        <module type="assembly5.ReportManagerServicesComponentModule, assembly5" />
        <module type="assembly6.NHibernateComponentModule, assembly6">
            <properties>
                <property name="DatabaseConfigurationSectionName" value="databaseSettingsEClient" />
            </properties>
        </module>
        <module type="assembly7.AutofacModules.ComponentModule, assembly7" />
        <module type="assembly8.AutofacModules.ComponentModule, assembly8" />
        <module type="assembly9.AutofacModules.ComponentModule, assembly9" />
        <module type="Console1.AutofacModules.ComponentModule, Console1" />
    </modules>
</autofac>

如您所见,使用builder.RegisterModule在代码上进行复制有很多配置。

答案

最后我使用方法builder.RegisterModule来注册模块:

    protected override void Load(ContainerBuilder builder)
    {
        ...
        bool executeLocal = false;
        var executeLocalObj = Thread.GetData(Thread.GetNamedDataSlot("ExecuteLocal"));
        if (executeLocalObj != null)
        {
            executeLocal = (bool)executeLocalObj;
        }
        if (executeLocal)
        {
            builder.RegisterModule(new mpm.seg.Common.Database.AutofacModules.NHibernateComponentModule());
            builder.RegisterModule(Activator.CreateInstance(Type.GetType("assembly1.ComponentModule, assembly1")) as IModule);
            builder.RegisterModule(Activator.CreateInstance(Type.GetType("assembly2.AutofacModules.ComponentModule, assembly1")) as IModule);
            builder.RegisterModule(Activator.CreateInstance(Type.GetType("assembly3.AutofacModules.ComponentModule, assembly3")) as IModule);
            builder.RegisterModule(Activator.CreateInstance(Type.GetType("assembly4.AutofacModules.ComponentModule, assembly4")) as IModule);
            builder.RegisterModule(Activator.CreateInstance(Type.GetType("assembly5.AutofacModules.ComponentModule, assembly5")) as IModule);
            builder.RegisterModule(new assembly6.AutofacModules.NHibernateComponentModule() { DatabaseConfigurationSectionName = "databaseSettings" });
            builder.RegisterModule(Activator.CreateInstance(Type.GetType("assembly7.AutofacModules.ComponentModule, assembly7")) as IModule);
            builder.RegisterModule(Activator.CreateInstance(Type.GetType("assembly8.AutofacModules.ComponentModule, assembly8")) as IModule);
            builder.RegisterModule(Activator.CreateInstance(Type.GetType("assembly9.AutofacModules.ComponentModule, assembly9")) as IModule);
        }
    }

其中executeLocal是通过线程数据发送到Load的标志:

Thread.SetData(Thread.GetNamedDataSlot("ExecuteLocal"), executeLocal);

以上是关于如何动态加载Autofac配置进行初始化的主要内容,如果未能解决你的问题,请参考以下文章

csharp autofac webapi配置,在dll加载时预处理。

TabLayout - 如何仅在选项卡上加载片段

jquery easyui datagrid在进行初始化页面加载的时候,如何数据没有加载完毕,动态加载数据.

.netcore3.0 autofac 注入过程中如何初始化一某个服务,注入之后我如何初始化我的服务 不放在构造函数中?

在android中动态创建选项卡并使用传入的参数加载片段

Echarts动态加载后台数据