我目前正开始使用插件扩展Microsoft Dynamics CRM。

是否可以向这些插件添加依赖注入(inject)(用于测试,松耦合等)?我在哪里可以注册我的IoC容器,以便将其用于所有相同类型的插件?

最佳答案

我们一直在尝试对Dynamics CRM应用程序进行单元测试并将依赖项注入(inject)应用。不幸的是,随着Microsoft支持和顾问的确认,没有任何支持的方法。您可以将所有插件业务逻辑转移到另一个业务类并应用依赖项注入(inject),也可以停止考虑。

如果选择使用Dynamics CRM进行反击,则需要在插件父类(super class)中定义一个静态字段,该父类(super class)将成为您的DI容器。如下,

public abstract class SuperPlugin : IPlugin{
       public void Execute(IServiceProvider serviceProvider){
            // initialize a static container instance if not available
            var containerWrapper = new ContainerWrapper{
                Container = serviceProvider.GetService(typeof(IPluginExecutionContext)),
                Resolver = //static resolver instance of dependency container
            };
            OnExecution(containerWrapper);
       }
       public abstract void OnExecution(IDependencyResolver resolver);
}

我真的不明白,为什么Microsoft不只是让我们向内部使用的IServiceProvider实现注册某些组件。

附言由于您的SuperPlugin类是IPlugin,因此您可能会忘记在子类上编写接口(interface)实现。但是我们在官方Dynamics CRM SDK附带的插件注册工具上遇到了一些错误。因此,如果您可能遇到相同的问题,还应该按照以下方式实现您的插件,
public class MyPlugin : SuperPlugin, IPlugin{
  public abstract void OnExecution(IDependencyResolver resolver){};
}

编辑:请参见一个解释https://github.com/nakahparis/DIForCRM概念的小示例

关于c# - MS Dynamics CRM中的依赖注入(inject),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/21140707/

10-13 08:29