2009-12-09 6 views
15

Я использую Контейнер WindCor IoC для своего веб-приложения для разрешения реализации уровня доступа к данным, которое приложение должно использовать.MEF: Где я должен поставить CompositionContainer?

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

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

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

Очевидно, что мне придется использовать DirectoryCatalog, который сканирует DLL-файлы в папке bin приложения и возвращает все, что мне нужно.

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

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

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

ответ

11

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

В целом с точки зрения вопросов о том, где поставить контейнер, я рекомендую следующие сообщения: http://blogs.msdn.com/nblumhardt/archive/tags/Container+Managed+Application+Design/default.aspx

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

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

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 Гленн

Смежные вопросы