Wir haben versucht, Einheit-Test und Anwendung Abhängigkeitseinspeisung für unsere Dynamics CRM-Anwendung. Da Microsoft Support und Berater bestätigt sind, gibt es leider keinen unterstützten Weg. Sie können entweder Ihre gesamte Plugin-Geschäftslogik in eine andere Business-Klasse übertragen und die Abhängigkeitsinjektion anwenden oder aufhören, darüber nachzudenken.
Wenn Sie sich entscheiden, mit Dynamics CRM zu kämpfen, müssen Sie ein statisches Feld in einer Superklasse des Plugins definieren, die Ihr DI-Container sein wird. Wie folgt,
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);
}
Ich kann wirklich nicht verstehen, warum Microsoft nicht einfach lassen Sie uns einige Komponenten der IServiceProvider Implementierung registrieren, die sie intern verwenden.
Ps.Da Ihre SuperPlugin-Klasse ein IP-Plugin ist, vergessen Sie möglicherweise, die Schnittstellenimplementierung für die Subklasse zu schreiben. Wir haben jedoch einige Fehler im Plugin-Registrierungstool festgestellt, das mit dem offiziellen Dynamics CRM SDK ausgeliefert wird. So im Falle können Sie das gleiche Problem haben, sollten Sie auch Ihre Plugins wie folgt implementieren,
public class MyPlugin : SuperPlugin, IPlugin{
public abstract void OnExecution(IDependencyResolver resolver){};
}
Edit: ein kleines Beispiel sehen, dass das Konzept https://github.com/nakahparis/DIForCRM
Sie erklärt für diese Funktion auf https abstimmen: //ideas.dynamics.com/ideas/dynamics-crm/814208 –