MEF: Куда я должен поместить CompositionContainer?

Я использовал Контейнер МОК Виндзора для своего веб-приложения, для разрешения реализации уровня доступа к данным, которую должно использовать приложение.

UI веб-приложения будет состоять из страниц, и каждая страница состоит из небольших единиц, названных портлетами. (Их понятие несколько подобно виджетам.) Эти так называемые портлеты являются в основном веб-элементами управления и могут быть настроены во времени выполнения для каждой страницы invidually.

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

Я выяснил, что этот механизм точно, для чего создается MEF. Таким образом, я решил реализовать систему таким способом, которым она обнаруживает портлеты с помощью MEF. Затем я понял, что это может также сделать то, для чего я в настоящее время использую Виндзор, таким образом, я решил в канаву Виндзор в пользу MEF.

Очевидно, я должен буду использовать DirectoryCatalog, который сканирует для .dlls в папке мусорного ведра приложения и возвращает все, в чем я нуждаюсь.

Я прочитал некоторые учебные руководства, примеры и все вопросы относительно MEF в StackOverflow, также. Я полагал, что самый легкий способ использовать MEF через PartInitializer, который Glenn Block упомянул в своих учебных руководствах, но я понял, что это не находится в MEF. На самом деле это находится в коде, который я загрузил с CodePlex, но в отдельном блоке, и только в источнике, не в двоичной форме. (Это означает, что это не часть MEF? Или какой смысл того, чтобы поместить его в отдельный проект?) Затем я понял, что это для Silverlight, таким образом, это действительно не помогает мне. (Или я должен просто скомпилировать это против.NET 3.5 или включать ее в мой проект, и я хорош пойти?)

Таким образом, теперь у меня есть проблема, которая следующая: куда я должен поместить CompositionContainer в свое приложение?

Существует другая вещь, которую я хотел бы рассмотреть: я должен использовать только один CompositionContainer во время жизни приложения, или я - более обеспеченное создание контейнера в течение каждого раза, когда мне нужен он?

15
задан casperOne 22 December 2010 в 18:55
поделиться

1 ответ

Хорошие вопросы.

В общем плане, что касается вопросов о том, куда помещать контейнер, я рекомендую следующие сообщения: http://blogs.msdn.com/nblumhardt/archive/tags/Container+Управленное+Приложение+Дизайн/дефолт.aspx

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

Вы можете посмотреть эти статьи для более глубокого понимания того, как это сделать:

http://blogs.msdn.com/hammett/archive/2009/04/23/mef-and-asp-net-mvc-sample.aspx http://blogs.msdn.com/hammett/archive/2009/07/15/mef-and-asp-net-mvc-sample-updated.aspx http://mef.codeplex.com/wikipage?title=Parts%20Lifetime&referringTitle=Guide

Что касается PartInitializer, я бы избегал использования чего-нибудь подобного, если только вам не придется. ASP.NET предоставляет достаточное количество крючков в конвейере через HTTP обработчики, модули и т.д., чтобы позволить автоматически компоновать при создании.

Единственное место, которое я бы увидел, используя PI в сети, возможно, находится под пользовательским контролем. PI поставляется как часть Silverlight 4 и не доступен в коробке для .NET 4.0. Я создал удобную для использования версию для .NET 4.0, которую вы можете найти здесь: http://cid-f8b2fd72406fb218.skydrive.live.com/self.aspx/blog/Composition.Initialization.Desktop.zip

HTH. Гленн

11
ответ дан 1 December 2019 в 04:53
поделиться
Другие вопросы по тегам:

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