我是否需要工厂才能在插件中获取服务?

时间:2013-03-22 12:16:15

标签: plugins dynamics-crm-2011

我在插件中使用的代码看起来像这样。

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

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

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

2 个答案:

答案 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,除非你遇到一些非常奇怪的情况,否则这是你的选择。