MEF: Где я должен поставить CompositionContainer?

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

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

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

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

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

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

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

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

Ответы

Ответ 1

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

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

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

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

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

НТН Гленн