Я следующий сценарий для объявления экспорта плагинов для моего приложения:Используя аргументы конструктора с 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 (AssemblyName), кажется, не обнаружить RealPlugin, как загружаемый элемент и Load () метод никогда не вызывается. Он работает, если я добавляю дополнительный публичный конструктор без аргументов для обоих классов. Тем не менее, я на самом деле не хочу этого делать, потому что я не хочу, чтобы кто-либо создавал экземпляр RealPlugin без указания источника данных.
Уродливое обходное решение похоже на маркировку конструкторов без параметров [Устаревшее], что, по крайней мере, предотвращает их случайное использование.
Конечно, я мог бы также создавать отдельные классы, происходящие из NinjectModule, для создания привязок, но для каждого из моих плагинов требуется еще один класс, что также не так хорошо (и предотвращает привязку к динамическому типу экземпляра, как видно выше)
Кто-нибудь понял, как такой плагин можно зарегистрировать без наличия открытого конструктора без параметров?
Я уверен, что ninject не поддерживает впрыскивание чего-либо в конструкторы модулей, поэтому, если для модуля требуется параметр ctor, вам всегда нужно будет его самостоятельно создать и загрузить его с помощью 'Kernel.Load (NinjectModule)' вместо использования 'Kernel.Load (AssemblyName)'. – BatteryBackupUnit
Также см. Http://stackoverflow.com/questions/8022062/how-to-inject-an-object-into-a-ninject-module – BatteryBackupUnit
@BatteryBackupUnit: Мне все равно, что вы вводите что-либо в модуль, я просто Не хочу создавать публичный конструктор. Я был бы рад, если бы он работал с защищенными или частными конструкторами. – PMF