我需要知道哪个类别的CRM 2011调用了插件。
我是插件的新手,但我认为每次调用它们都使用相同的过程。 我需要让它们在不同的实例上工作。
让我举一个例子。我有一个IPlugin
类的实现,其成员名为_log
。
public class Plugin : IPlugin {
private static String _log;
}
所以,如果我有异步插件,每次插件触发时,我应该有新对象,对吧?当我观察日志文件时,我注意到在同一个日志中,插件的进程不止一个。示例:“Log-> obj1.method_1,obj2.method_1”这就像类插件只有一个实例,每次插件触发时,它只是调用Execute()
方法使用不同的< em> serviceProvider 参数。这可能吗?有什么想法吗?
答案 0 :(得分:1)
我不确定你在问什么,但我猜你的插件存在一些多线程问题。无法更改它,因此每次都会创建一个新对象。任何类级变量都会创建竞争条件。为什么您认为每个插件调用需要处于不同的进程中?
为什么不直接创建一个新对象作为插件的第一步,传入执行过程?将插件中定义的所有类级别变量移动到新类中。这样您就不必担心多线程问题了。
// 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方法 无状态因为没有为每次调用调用构造函数 插件。此外,多个系统线程可以执行 插件同时出现。每个调用状态信息都是 存储在上下文中,所以你不应该使用全局变量 插件或尝试将任何数据存储在成员变量中以供使用 在下一个插件调用期间。