Ich habe das folgende Szenario Export-Plugins für meine Anwendung für die Erklärung:Mit Konstruktorargumente mit NinjectModule
public abstract class PluginBase : NinjectModule
{
protected PluginBase(IDataSource source)
{
// ...
}
public override void Load()
{
Bind<PluginBase>().To(GetType());
}
}
public class RealPlugin : PluginBase
{
public RealPlugin(IDataSource source)
{
// ...
}
}
Unfortunatelly, Kernel.Load (Assembly) scheint nicht RealPlugin als ladbares Element und die Last zu erfassen () Methode wird nie aufgerufen. Es funktioniert, wenn ich einen zusätzlichen öffentlichen Konstruktor ohne Argumente für beide Klassen hinzufüge. Das möchte ich aber eigentlich nicht, weil ich nicht möchte, dass jemand eine Instanz von RealPlugin erstellt, ohne die Datenquelle anzugeben.
Ein hässlicher Workaround scheint zu sein, die parameterlosen Konstruktoren mit [Obsolete] zu markieren, was zumindest verhindert, dass sie versehentlich verwendet werden.
Natürlich könnte ich auch separate Klassen erstellen, die von NinjectModule abgeleitet sind, um die Bindungen zu erstellen, aber das erfordert eine andere Klasse für jedes meiner Plugins, was auch nicht so schön ist (und verhindert die Bindung an den dynamischen Typ der Instanz), wie oben zu sehen)
Jeder hat eine Idee, wie ein solches Plugin registriert werden kann, ohne einen öffentlichen parameterlosen Konstruktor zu haben?
Ich bin mir ziemlich sicher, dass ninject keine Unterstützung für Modulkonstruktoren bietet. Wenn ein Modul also einen ctor-Parameter benötigt, muss man es selbst neu erstellen und stattdessen mit 'Kernel.Load (NinjectModule)' laden mit 'Kernel.Load (AssemblyName)'. – BatteryBackupUnit
Siehe auch http://stackoverflow.com/questions/8022062/how-to-inject-an-object-into-a-ninject-module – BatteryBackupUnit
@BatteryBackupUnit: Es ist mir egal, etwas in das Modul injizieren, ich nur don Ich möchte keinen öffentlichen Konstruktor erstellen. Ich würde mich freuen, wenn es auch mit geschützten oder privaten Konstrukteuren arbeiten würde. – PMF