我在插件中使用的代码看起来像这样。
IOrganizationServiceFactory serviceFactory =
(IOrganizationServiceFactory)serviceProvider.GetService(
typeof(IOrganizationServiceFactory));
IOrganizationService service = serviceFactory
.CreateOrganizationService(Context.UserId);
我想知道使用这种语法来获取我的服务是不够的。
IOrganizationService service =
serviceProvider.GetService(typeof(IOrganizationService));
答案 0 :(得分:4)
您的问题让我看到了我的插件IOrganizationService
创作。我编写了三个扩展方法,以使我的生活更轻松,其中一个使用工厂方法,一个不使用(尽管它传入插件执行上下文)。这些方法现在已经在生产中使用了一段时间。我只是不确定为什么我使用工厂服务,一种方法,而不是另一种方法。
public static IPluginExecutionContext GetContext(this IServiceProvider provider)
{
return (IPluginExecutionContext) provider.GetService(typeof(IPluginExecutionContext));
}
public static IOrganizationService GetService(this IServiceProvider provider, IPluginExecutionContext context)
{
return provider.GetService(context, context.UserId);
}
public static IOrganizationService GetService(this IServiceProvider provider, IPluginExecutionContext context, Guid impersonationUser)
{
var serviceFactory = (IOrganizationServiceFactory)provider.GetService(typeof(IOrganizationServiceFactory));
return serviceFactory.CreateOrganizationService(impersonationUser);
}
Commenter指出第二种方法调用第三种方法,这样两种方法都使用工厂来创建服务。
答案 1 :(得分:1)
我大部分时间都使用这种语法。
IOrganizationService service = provider.GetService(typeof(IOrganizationService));
但是,可能会建议使用工厂方法。我不确定CRM的SDK如何处理事物,但一般来说,工厂是一个静态类,可以为您生成对象。这样,有更多功能(可能)将使您的编程生活更轻松(或更令人困惑)。
我的理解是这两种语法都适用于CRM,除非你遇到一些非常奇怪的情况,否则这是你的选择。