我目前正开始使用插件扩展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/