我正在研究 CRM 中早期和晚期绑定的优缺点。我对这个主题有一个好主意,但有些地方我不清楚。
有人说早买最快,有人说晚买。有什么显着差异吗?
如何处理自定义实体的早期绑定?
如何处理具有自定义字段的默认实体的早期绑定?
有很多链接,但最有用的是我的鼠标。还有其他指针吗?
我正在研究 CRM 中早期和晚期绑定的优缺点。我对这个主题有一个好主意,但有些地方我不清楚。
有人说早买最快,有人说晚买。有什么显着差异吗?
如何处理自定义实体的早期绑定?
如何处理具有自定义字段的默认实体的早期绑定?
有很多链接,但最有用的是我的鼠标。还有其他指针吗?
有人说早出价最快,其他人说晚出价。有什么显着差异吗?
一种。由于早期绑定只是后期绑定实体类的包装器,并且包含其中的所有功能,因此它的运行时不会比后期绑定更快。但是,这种差异非常小,我在 What's Fastest 类型的问题中与 Eric Lippert不同。一个不可忽略的速度差异是开发速度。早期绑定对于开发来说要快得多,而且更不容易出错恕我直言。
如何处理自定义实体的早期绑定?
一种。CrmSrvcUtil为自定义实体生成早期绑定的类,就像默认的一样(我创建了这个工具来使生成类更加容易。 更新:它已经转移到GitHub 更新 2现在在 XrmToolBox 插件商店中,搜索为"Early Bound Generator"
)。每次对 CRM 实体进行更改时,都需要更新实体类型定义(仅当您想要使用新的属性或实体,或者您已删除当前使用的属性或实体时。您可以使用过时的早期绑定实体类,只要您不设置任何实际不存在的属性的值,这与后期绑定的确切要求相同)
如何处理具有自定义字段的默认实体的早期绑定?
一种。请参阅问题 2 的答案。
使用早期绑定实体时的小问题之一是需要在您的IOrganizationService
. 这对于 .js 来说很容易OrganizationServiceProxy
,但对于插件,尤其是自定义工作流活动,可能需要更多步骤。
下面是我的代码,针对一个相当不活跃的本地开发环境进行测试。随意为自己测试
using (var service = TestBase.GetOrganizationServiceProxy())
{
var earlyWatch = new Stopwatch();
var lateWatch = new Stopwatch();
for (int i = 0; i < 100; i++)
{
earlyWatch.Start();
var e = new Contact() { FirstName = "Early", LastName = "BoundTest"
e.Id = service.Create(e);
earlyWatch.Stop();
lateWatch.Start();
var l = new Entity();
l.LogicalName = "contact";
l["firstname"] = "Late";
l["lastname"] = "BoundTest";
l.Id = service.Create(l);
lateWatch.Stop();
service.Delete(e);
service.Delete(l);
}
var earlyTime = earlyWatch.ElapsedMilliseconds;
var lateTime = lateWatch.ElapsedMilliseconds;
var percent = earlyWatch.ElapsedTicks / (double)lateWatch.ElapsedTicks;
}
我的两个测试结果(请注意,运行两个测试在统计上并不显着,无法得出任何统计结论,但我认为它们赋予了它的权重,因为它并没有那么大的性能下降来证明一些开发收益是合理的)在哪里运行针对本地开发环境,几乎没有其他活动来破坏测试。
Number Creates | Early (MS) | Late (MS) | % diff (from ticks)
10 | 1242 | 1106 | 12.3%
100 | 8035 | 7960 | .1%
现在让我们插入数字并查看差异。12% 看起来很多,但 12% 是什么?实际差异为 0.136 秒。假设您Contacts
每分钟创建 10 个... .136 x 60 分钟/小时 x 24 小时/天 = 195.84 秒/天或每天大约 3 秒。假设您花了 3 个开发人员小时试图找出哪个更快。为了让程序能够节省那么多时间,需要 60 天的 24/7 10 联系人/分钟处理,以便更快的代码“回报”3 小时的决策。
所以规则是,总是选择比首先更快的方法更具可读性/可维护性的方法。如果性能不够快,那么看看其他可能性。但是 100 次中有 98 次,它确实不会以最终用户可以检测到的方式影响性能。
过早的优化是万恶之源——DonaldKnuth
然而,这些 MSDN 文章建议后期绑定它更快。
使用 Microsoft Dynamics CRM 进行开发的最佳实践
使用早绑定类型
当您的代码必须处理编写代码时未知的实体和属性时,请使用 Entity 类。此外,如果您的自定义代码与数千个实体记录一起使用,则使用 Entity 类会导致比早期绑定实体类型稍好一些的性能。但是,这种灵活性有一个缺点,因为您无法在编译时验证实体和属性名称。如果您的实体已在代码时定义并且轻微的性能下降是可以接受的,您应该使用可以通过使用 CrmSvcUtil 工具生成的早期绑定类型。有关详细信息,请参阅在代码中使用早期绑定实体类。
为 Microsoft Dynamics CRM 选择托管代码的开发风格
实体编程(Early Bound vs. Late Bound vs. Developer Extensions)
早期绑定...序列化成本随着实体在网络传输期间转换为后期绑定类型而增加。
2 & 3. 您不必对自定义字段或实体采取任何特殊操作。Svcutil 将为两者生成类。
代码生成工具创建的类包括实体的所有属性和关系。通过在代码中使用类,您可以访问这些属性并确保类型安全。为组织中的所有实体创建了一个具有属性和关系的类。系统实体和自定义实体的生成类型之间没有区别。
作为旁注,我不会太挂念它,它们都是可接受的实现方法,在大多数情况下,我怀疑性能影响是否足以令人担忧。我个人更喜欢后期绑定,但这主要是因为我不喜欢生成类。
编辑。
我通过在 CRM 中创建帐户(一组 200 和 5000)对此进行了一些快速分析。它证实了 Microsoft 提供的信息,在两次运行中,后期绑定都快了大约 8.5 秒。在非常短的运行中,后期绑定明显更快 - 90%。然而,早期绑定很快就会加快速度,到创建 5000 条记录时,后期绑定仅快 2%。