我正在为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中的自定义活动吗?
答案 0 :(得分:2)
好问题。据我所知,如果您的程序集未在沙箱模式中注册,则会遇到静态数据时遇到的问题,因此您必须创建一些方法来唯一限定引用(如第二个示例所示)。
然而,这违反了Microsoft在插件/工作流活动开发中的最佳做法。每个插件都不应该依赖于传递给插件的状态之外的状态。以下是MSDN上发现的HERE:
插件的Execute方法应该写成无状态的,因为 每次调用插件时都不会调用构造函数。 此外,多个系统线程可以同时执行插件 时间。所有每个调用状态信息都存储在上下文中, 所以你不应该使用全局变量或尝试存储任何数据 在下一个插件调用期间使用的成员变量,除非 该数据是从提供给的配置参数获得的 构造函数。
因此管理缓存的理想方法是使用一个或多个CRM记录(可能是自定义的)或使用不同的服务来缓存此数据。
答案 1 :(得分:1)
CRM前端内所有组织的同步插件都在同一个AppDomain中运行。所以你的第二种方法会奏效。不幸的是,异步服务在不同的进程中运行,从而无法访问进程内缓存。
答案 2 :(得分:0)
我认为Microsoft NOT 在技术上至少不可能在自己的AppDomain中实现每个CRM 组织,更不用说每个加载的程序集都有AppDomain。我试图想象如何将多个版本的插件程序集部署到多个组织并在同一个AppDomain中加载和执行,我无法想到一个现实的方法。但这可能是我缺乏想象力。
我认为您的问题更多地出现在并发(多线程)中,而不是跨组织共享相同插件。 @BlueSam引用微软的话说他们似乎在说同一个插件的多个实例可以存在于一个AppDomain中。确保多个线程可以同时读取/写入你的内存缓存,你会没事的。如果你真的想确定,请在第二个例子中添加带有OrgId的缓存密钥。
我认为你能够实现并发缓存,所以我不会在那里详细介绍。