1

我在插件中使用的代码如下所示。

IOrganizationServiceFactory serviceFactory =
  (IOrganizationServiceFactory)serviceProvider.GetService(
    typeof(IOrganizationServiceFactory));
IOrganizationService service = serviceFactory
  .CreateOrganizationService(Context.UserId);

我想知道使用这种语法来获得我的服务是否还不够。

IOrganizationService service = 
  serviceProvider.GetService(typeof(IOrganizationService));
4

2 回答 2

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);
}

编辑

评论者指出,第二种方法调用了第三种方法,这样,两种方法都使用工厂来创建服务。

于 2013-03-22T12:38:11.300 回答
1

我大部分(所有)时间都使用这种语法。

IOrganizationService service = provider.GetService(typeof(IOrganizationService));

但是,可能建议使用工厂方法。我不确定 CRM 的 SDK 是如何处理事情的,但一般来说,工厂是为您生​​成对象的静态类。这样,有更多的功能(可能)将使您的编程生活更轻松(或更令人困惑)。

据我了解,这两种语法都适用于 CRM,除非您遇到一些非常奇怪的情况,否则这是您的选择。

于 2013-03-24T18:11:19.387 回答