можно легко сделать это с нормальным отражением C#, Вам не нужна никакая дополнительная технология.
существует довольно много примеров в сети, например, http://www.codeproject.com/KB/cs/c__plugin_architecture.aspx
В целом в Вашем главном приложении, необходимо загрузить блок, реализовав плагин, например:
ass = Assembly.Load(name);
и затем необходимо создать экземпляр плагина. Если бы Вы знаете название класса, это было бы похоже на это:
ObjType = ass.GetType(typename);
IPlugin plugin = (IPlugin)Activator.CreateInstance(ObjType);
и затем Вы просто используете его.
Существует несколько способов пойти об этом, и Вы уже выполнили главную цель достигнуть этого в наличии конкретных реализаций через предопределенные интерфейсы. Реалистично, если Ваши интерфейсы остаются стабильными, необходимо быть в состоянии создать прочь из базового приложения.
я не уверен, как реализация работала бы с Ninject, как бы то ни было. Можно сделать это с Модель Поставщика или с отражением - хотя я думаю, что отражение является излишеством, если Вы не должны абсолютно делать этого.
С подходом модели поставщика, Вы помещаете файл в / папку мусорного ведра или любую другую папку, которую Вы зондируете, и корректируют .config файл для отражения присутствия поставщика. Если у Вас есть определенная "сменная" папка, можно создать метод, заходил в запуск приложения и периодически, иначе, чтобы просканировать для новых или удаленных экземпляров и перезагрузить поставщиков.
Это работало бы в ASP.NET под C# или VB. Однако при выполнении своего рода другого приложения необходимо было бы рассмотреть другой подход. Поставщик является вращением действительно просто Microsoft на Стратегическая модель .
Я получил это как хит для Активатора. CreateInstance + Ninject и просто требуемый для указания на что-то в этой области - надо надеяться, это вдохновит кого-то придумывать реальный уничтожающий ответ на этот вопрос на ТАК.
, Если Вы еще не перешли к проблеме автопросканировать Модули и классы и зарегистрировать их в Ninject правильно, и все еще создаете свой плагин через Активатор. CreateInstance, затем Вы можете post-CreateInstance вводить зависимости на пути
IKernel k = ...
var o = Activator.CreateInstance(...);
k.Inject( o );
, Конечно, это только было бы временным решением на пути к чему-то как http://groups.google.com/group/ninject/browse_thread/thread/880ae2d14660b33c
Проблема состоит в том, что Вы, возможно, должны были бы перекомпилировать, если объект, который Вы устанавливаете в загрузке Вашего модуля, используется в программе. Причина состоит в том, что Вы программируете, не мог бы иметь последней версии блока Вашего класса. Пример при создании нового реального класса для одного из интерфейса позволил, говорят, что Вы изменяете плагин dll. Теперь, Инжектор загрузит его, прекрасный, но когда это будет возвращено в Вашей программе (kernel.get (...)), Ваша программа не могла бы иметь блока и бросит ошибку.
Пример того, о чем я говорю:
BaseAuto auto = kernel.Get<BaseAuto>();//Get from the NInjector kernel your object. You get your concrete objet and the object "auto" will be filled up (interface inside him) with the kernel.
//Somewhere else:
public class BaseModule : StandardModule
{
public override void Load(){
Bind<BaseAuto>().ToSelf();
Bind<IEngine>().To<FourCylinder>();//Bind the interface
}
}
, Если Вы имеете, создают новый FourCylinder по имени SixCylinder, Ваша реальная программа не будет иметь никакой ссылки на Ваш новый объект. Так, как только Вы загрузите из PlugIn BaseModule.cs, Вы могли бы получить некоторую проблему со ссылкой. Чтобы быть в состоянии сделать это, необходимо будет распределить новый dll этой конкретной реализации с плагином, который будет иметь Модуль, которого Инжектор потребует для загрузки Интерфейса в Реальный класс. Это может быть сделано без проблемы, но Вы начинаете иметь целое приложение, которые находятся при загрузке из Плагина, и это могло бы быть проблематично в некоторых точках. Знайте.
, НО, если Вы действительно хотите некоторую информацию о PlugIn, можно получить [приблизительно 111] учебное руководство от CodeProject.
Взгляните на структуру управляемой расширяемости. http://www.codeplex.com/MEF
Этот вопрос относится к тому же ответу, который я дал здесь: Может ли NInject загружать модули / сборки по запросу?
Я почти уверен, что это именно то, что вы ищете:
var kernel = new StandardKernel();
kernel.Load( Assembly.Load("yourpath_to_assembly.dll");
Если вы посмотрите на KernelBase с отражателем в Ninject.dll, вы увидите, что этот вызов рекурсивно загружает все модули в загруженных сборках (метод Load принимает IEnumerable)
public void Load(IEnumerable<Assembly> assemblies)
{
foreach (Assembly assembly in assemblies)
{
this.Load(assembly.GetNinjectModules());
}
}
I 'm, используя это в сценариях, где мне не нужна прямая ссылка на сборку для чего-то, что будет очень часто меняться, и я могу поменять сборку, чтобы предоставить другую модель приложению (при условии, что у меня есть соответствующие тесты)