在CRM 2011中,哪个类调用dll插件安装?

时间:2012-11-16 12:03:27

标签: dynamics-crm dynamics-crm-2011 crm

我需要知道哪个类别的CRM 2011调用了插件。

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

让我举一个例子。我有一个IPlugin类的实现,其成员名为_log

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

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

2 个答案:

答案 0 :(得分: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对象,这将消除任何可能的非静态竞争条件。

如果您仍有问题,请发布您的代码。

答案 1 :(得分:0)

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

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

  

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