Мы пытались выполнить модульное тестирование и применить инъекцию зависимостей в нашем приложении Dynamics CRM. К сожалению, по мере подтверждения поддержки и консультантов Microsoft, нет способа поддержать это. Вы можете либо перевести всю свою бизнес-логику плагина в другой бизнес-класс, либо применить инъекцию зависимостей или перестать думать об этом.
Если вы решите сражаться с Dynamics CRM, вам нужно определить статическое поле над суперклассом плагина, который будет вашим контейнером 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, что они используют внутри.
Ps.Поскольку ваш класс SuperPlugin является IPlugin, вы можете забыть написать реализацию интерфейса в подклассе. Но мы столкнулись с некоторыми ошибками в инструменте регистрации плагинов, который поставляется с официальным SDK Dynamics CRM. Таким образом, в случае, если вы можете иметь ту же проблему, вы также должны реализовать свои плагины следующим образом,
public class MyPlugin : SuperPlugin, IPlugin{
public abstract void OnExecution(IDependencyResolver resolver){};
}
Edit: См небольшой пример, который объясняет концепцию https://github.com/nakahparis/DIForCRM
Вы можете проголосовать за эту функцию на https: //ideas.dynamics.com/ideas/dynamics-crm/814208 –