0

我需要知道哪一类 CRM 2011 调用了安装的插件。

我是插件的新手,但我认为每次调用它们都使用相同的过程。我需要让它们在不同的实例上工作。

让我介绍一个例子。我有一个IPlugin类的实现,其中有一个名为_log.

public class Plugin : IPlugin { 
    private static String _log;
}

所以,如果我有异步插件,每次插件触发器,我应该有新的对象,对吧?当我查看日志文件时,我注意到在同一个日志中,插件的进程不止一个。示例:“Log-> obj1.method_1, obj2.method_1” 就像类插件只有一个实例,每次触发插件时,它只是调用Execute()不同的serviceProvider参数的方法。这可能吗?任何想法?

4

2 回答 2

1

我不确定你在问什么,但我猜你的插件有一些多线程问题。无法更改它,因此每次都会创建一个新对象。任何类级别的变量都会产生竞争条件。为什么你认为你需要每个插件调用都在不同的进程中?

编辑 1

为什么不直接创建一个新对象作为插件的第一步,传入执行过程?将插件中定义的所有类级别变量移动到新类。这样您就不必担心多线程问题。

编辑 2 - 示例 ##

// Your actual IPlugin class would only contain this, nothing else.
public class MyPlugin : IPlugin
{
    public void Execute(IServiceProvider serviceProvider)
    {       
        new MyPluginLogic().ExecutePluginLogic(serviceProvider);    
    }
}

public class MyPluginLogic{
    private static String _log;

    public void ExecutePluginLogic(IServiceProvider serviceProvider){
        // Do what ever logic you were previously doing in your plugin class.
    }
}

如果您以这种方式设置代码,则可以保证MyPluginLogic每次调用插件时都会获得一个新对象,这将消除任何可能的非静态竞争条件。

如果您仍然遇到问题,请发布您的代码。

于 2012-11-16T13:03:51.897 回答
0

听起来您的逻辑遇到了问题,并决定采用一种与 CRM 应该工作的方式不兼容的方法来修复它。退后一步,描述一下为什么你觉得“每个调用都必须在不同的实例上工作”。

正如@Daryl 正确指出的那样,没有办法更改Plugin对象的缓存,这正是CRM SDK声明的原因:

为了提高性能,Microsoft Dynamics CRM 缓存插件实例。插件的 Execute 方法应该写成无状态的,因为不是每次调用插件都会调用构造函数。此外,多个系统线程可以同时执行插件。所有每次调用的状态信息都存储在上下文中,因此您不应在插件中使用全局变量或尝试将任何数据存储在成员变量中以供下次插件调用时使用。

于 2012-11-16T14:43:40.530 回答