Используя Ninject в плагине как архитектура

27
задан ThinkingStiff 27 July 2012 в 07:46
поделиться

6 ответов

можно легко сделать это с нормальным отражением 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);

и затем Вы просто используете его.

3
ответ дан Grzenio 28 November 2019 в 05:05
поделиться

Существует несколько способов пойти об этом, и Вы уже выполнили главную цель достигнуть этого в наличии конкретных реализаций через предопределенные интерфейсы. Реалистично, если Ваши интерфейсы остаются стабильными, необходимо быть в состоянии создать прочь из базового приложения.

я не уверен, как реализация работала бы с Ninject, как бы то ни было. Можно сделать это с Модель Поставщика или с отражением - хотя я думаю, что отражение является излишеством, если Вы не должны абсолютно делать этого.

С подходом модели поставщика, Вы помещаете файл в / папку мусорного ведра или любую другую папку, которую Вы зондируете, и корректируют .config файл для отражения присутствия поставщика. Если у Вас есть определенная "сменная" папка, можно создать метод, заходил в запуск приложения и периодически, иначе, чтобы просканировать для новых или удаленных экземпляров и перезагрузить поставщиков.

Это работало бы в ASP.NET под C# или VB. Однако при выполнении своего рода другого приложения необходимо было бы рассмотреть другой подход. Поставщик является вращением действительно просто Microsoft на Стратегическая модель .

0
ответ дан Joseph Ferris 28 November 2019 в 05:05
поделиться

Я получил это как хит для Активатора. 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

0
ответ дан Ruben Bartelink 28 November 2019 в 05:05
поделиться

Проблема состоит в том, что Вы, возможно, должны были бы перекомпилировать, если объект, который Вы устанавливаете в загрузке Вашего модуля, используется в программе. Причина состоит в том, что Вы программируете, не мог бы иметь последней версии блока Вашего класса. Пример при создании нового реального класса для одного из интерфейса позволил, говорят, что Вы изменяете плагин 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.

-1
ответ дан Patrick Desjardins 28 November 2019 в 05:05
поделиться

Взгляните на структуру управляемой расширяемости. http://www.codeplex.com/MEF

1
ответ дан 28 November 2019 в 05:05
поделиться

Этот вопрос относится к тому же ответу, который я дал здесь: Может ли 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, используя это в сценариях, где мне не нужна прямая ссылка на сборку для чего-то, что будет очень часто меняться, и я могу поменять сборку, чтобы предоставить другую модель приложению (при условии, что у меня есть соответствующие тесты)

12
ответ дан 28 November 2019 в 05:05
поделиться
Другие вопросы по тегам:

Похожие вопросы: