代码文件与dll中的Acumatica CustomizationPlugin

时间:2018-08-16 22:29:49

标签: acumatica

当我在在线Acumatica代码编辑器中(而不是在扩展库中)创建CustomizationPlugin类时,即使代码相同,我的OnPublished事件也会针对前者而不是后者触发。 CustomizationPlugins是否可以在扩展库中工作?无论类的内容如何,​​它都会发生,但是我将发布一些示例源...

//Customization plugin is used to execute custom actions after customization project was published  
public class WebConfigurator : CustomizationPlugin
{
    private Configuration _WebConfig;

    private Configuration WebConfig
    {
        get
        {
            if (_WebConfig == null)
            {
                _WebConfig = WebConfigurationManager.OpenWebConfiguration("~");
            }

            return _WebConfig;
        }
    }

    //This method executed right after website files were updated, but before website was restarted
    //Method invoked on each cluster node in cluster environment
    //Method invoked only if runtimecompilation is enabled
    //Do not access custom code published to bin folder, it may not be loaded yet
    public override void OnPublished()
    {
        this.WriteLog("OnPublished Event");

        SetAppSetting("DataPublisher:LoginPath", "auth/login");
        WebConfig.Save();
    }

    protected void SetAppSetting(string key, string value)
    {
        AppSettingsSection appSettingSection = (AppSettingsSection)WebConfig.GetSection("appSettings");

        if (appSettingSection.Settings.AllKeys.Contains(key))
        {
            appSettingSection.Settings[key].Value = value;
        }
        else
        {
            appSettingSection.Settings.Add(key, value);
        }
    }

    //This method executed after customization was published and website was restarted.  
    public override void UpdateDatabase()
    {
        this.WriteLog("UpdateDatabase Event");
    }
}

2 个答案:

答案 0 :(得分:1)

CustomizationPlugin继承者只有在进入App_RuntimeCode文件夹时才会执行。如果创建.dll文件,将不会执行。与CustomizationPlugin继承者有关的所有内容都只能执行一次。要记住的另一个细节是,如果将web.config文件中的UseRuntimeCompilation密钥设置为False,则平台将使用App_Code / Caches文件夹,而不是App_RuntimeCode,并且继承者也不会执行。默认情况下,UseRuntimeCompilation设置为true。

答案 1 :(得分:0)

您是否有理由不使用UpdateDatabase()方法作为插件的入口点?

我觉得这可能是因为您正在修改web.config文件。我建议尽可能避免这种情况。修改web.config会触发一连串的事件,并在IIS端进行重新编译,并且由于我们已经处于发布和重新编译IIS文件的上下文中,因此由于零星的锁定文件冲突,这可能导致IIS服务器行为不确定和挂起。

我还没有测试OnPublished方法,因为我没有测试它,但是我不知道UpdateDatabase有什么限制,所以我通过从内部创建一个新库进行了简单的测试定制项目编辑器:

enter image description here

然后我在库项目中添加了PX.Web.Customization.dll程序集,因为它需要引用Customization类型。 该项目是我所能做到的准系统,它包含一个名为Test.cs的源代码文件:

using Customization;
using System;

namespace Test
{
    public class Test : CustomizationPlugin
    {
        public override void UpdateDatabase()
        {
            throw new Exception();
        }
    }
}

然后我编译该库(调试模式),将编译后的DLL文件粘贴到我的Acumatica实例的Bin文件夹中。然后,我创建了一个新的完全空的定制项目。在“文件”部分中,使用+按钮添加“ Test.dll”库文件,保存项目,然后执行“使用清理发布”。

请注意,该项目不包含任何运行时代码,仅包含1个库文件。在发布控制台窗口中,我看到它执行了Test定制插件并停止了,因为它确实捕获了我从插件中抛出的异常: enter image description here