Перемещение данных через домен приложения с хорошей производительностью? - PullRequest
6 голосов
/ 08 сентября 2010

Небольшой фон

Я работаю над приложением .net, которое интенсивно использует плагины, приложение может запрашивать данные из плагинов, которые затем отправляются обратно и отображаются приложением.

Сначала я реализовал инфраструктуру плагинов в MEF, но чувствовал, что она немного ограничена для моих целей, я хотел иметь возможность изолировать плагины и иметь некоторую поддержку версий и лицензирования (так как плагины могут быть написаны третьей стороной).

Потом начал смотреть на MAF, который, кажется, поддерживает только эти сценарии, однако я вижу одну вещь, которая может быть проблемой, прежде чем я потрачу слишком много времени на изменение всего на MAF, было бы здорово знать, если у кого-то есть опыт работы сэта проблема, так как я много не работал с MAF.

Проблема

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

Теперь с MAF есть проблема Appdomain, я могу 't свободно отправлять все объекты через домен приложения, и наследование от marshalbyref для каждого объекта не является жизнеспособным.

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

Решение, которое, я думаю, может сработать, заключается в создании последовательности просто идентификаторов объектов и позволяет интерфейсу извлекать поля из плагина через домен приложения через прокси-сервер.Так, например, приложение говорит, что оно хочет имя поля x из items [y] в плагине, и эти строки передаются через домен приложения.

Вопрос

Итак, мои вопросы:способ сделать это, есть ли лучший способ?Я, очевидно, собираюсь немного подорвать производительность, перемещаясь по всей области приложения, но, поскольку это по требованию и только для небольшого числа объектов, это не должно быть слишком плохо, верно?Как мне настроить такой прокси-объект?

Это не самый простой вопрос в мире, извините.Буду очень признателен за любую информацию, от этого зависит будущее архитектуры плагина:)

Ответы [ 3 ]

2 голосов
/ 15 декабря 2010

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

Эта статья (более поздняя версия той, которую я первоначально написал;)) должна ответить на вопросы о том, какой механизм связи использовать для межпроцессного и межпроцессного перфорирования.

0 голосов
/ 15 декабря 2010

Насколько я читал, MEF был разработан только с базовой настройкой, чтобы мы все могли создавать функции, которые нам нужны, поверх него. Рассматривали ли вы добавление функций, или жесткие ограничения форсируют изменения?

По общему признанию, у меня нет опыта MEF в очень больших приложениях (где MAF больше подходит), и я не знаю, какие функции вам не хватает, но с MEF я еще не нашел то, что не смог бы ' добавить себя. По крайней мере, тогда у вас есть то, что вы хотите / нуждаетесь в этом!

0 голосов
/ 08 сентября 2010

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

Но, если честно, удаленное взаимодействие через IpcChannel кажется предпочтительным ...

...