2

我正在为 Microsoft CRM 中的一些插件做一些内存缓存。我试图弄清楚是否需要关注填充相同缓存的不同组织:

// In Some Plugin
var settings = Singleton.GetCache["MyOrgSpecificSetting"];
// Use Org specific cached Setting:

还是我需要做这样的事情来确保我不会交叉污染设置:

// In Some Plugin
var settings = Singleton.GetCache[GetOrgId() + "MyOrgSpecificSetting"];
// Use Org specific cached Setting:

我猜这也需要考虑到 AsyncWorkflowService 中的自定义活动?

4

3 回答 3

2

好问题。据我了解,如果您的程序集未在沙盒模式下注册,您将遇到您描述的问题,因此您必须创建某种方法来唯一限定引用(如您的第二个示例所做的那样)。

然而,这违背了微软在插件/工作流活动开发方面的最佳实践。每个插件都不应依赖于传递给插件的状态之外的状态。这是在 MSDN 上找到的内容

插件的 Execute 方法应该写成无状态的,因为不是每次调用插件都会调用构造函数。此外,多个系统线程可以同时执行插件。所有每次调用的状态信息都存储在上下文中,因此您不应使用全局变量或尝试将任何数据存储在成员变量中以供下次插件调用期间使用,除非该数据是从提供给构造函数的配置参数中获取的。

因此,管理缓存的理想方法是使用一个或多个 CRM 记录(可能是自定义的)或使用不同的服务来缓存这些数据。

于 2015-03-10T03:23:29.263 回答
1

CRM 前端中所有组织的同步插件在同一个 AppDomain 中运行。所以你的第二种方法会奏效。不幸的是,异步服务在单独的进程中运行,无法访问您的进程内缓存。

于 2015-05-04T17:48:13.807 回答
0

我认为微软在技术上不可能至少在自己的 AppDomain 中实现每个 CRM组织,更不用说每个加载的程序集一个 AppDomain。我试图想象插件程序集的多个版本如何部署到多个组织并在同一个 AppDomain 中加载和执行,但我想不出一种现实的方式。但这可能是我缺乏想象力。

我认为您的问题更多在于并发性(多线程),而不是跨组织共享同一插件。@BlueSam 引用微软的话,他们似乎在说同一个插件的多个实例可以存在于一个 AppDomain 中。确保多个线程可以同时读/写到你的内存缓存,你会没事的。如果您真的想确定,请在缓存键前面加上 OrgId,就像在第二个示例中一样。

我认为您将能够实现并发缓存,所以我不会在那里详细介绍。

于 2015-03-10T15:55:58.113 回答