2009-12-09 18 views
15

He estado utilizando el Windsor IoC Container para mi aplicación basada en web, para resolver la implementación de la capa de acceso a datos que la aplicación debería usar.MEF: ¿Dónde debería colocar el CompositionContainer?

interfaz de usuario de la aplicación web constará de páginas, y cada página se compone de pequeñas unidades llamadas portlets. (Su concepto es algo similar a los widgets). Estos llamados portlets son básicamente controles web y se pueden configurar en tiempo de ejecución para cada página de forma inadvertida.

La aplicación enviará con algunos de ellos incorporado, pero me gustaría que permita extender fácilmente.

me di cuenta de que este mecanismo es exactamente lo que el MEF está construido para. Así que decidí implementar el sistema de tal manera que descubriera portlets usando MEF. Luego, me di cuenta de que también puede hacer lo que actualmente uso Windsor, así que decidí deshacerme de Windsor a favor de MEF.

Obviamente, voy a tener que usar el DirectoryCatalog, que escanea los archivos .dll en la carpeta bin de la aplicación y devuelve todo lo que necesito.

leí algunos tutoriales, ejemplos y todas las preguntas relacionadas con el MEF en stackoverflow, así. Pensé que la forma más fácil de utilizar MEF es a través del PartInitializer que Glenn Block mencionó en sus tutoriales, pero me di cuenta de que no está en MEF. En realidad, está en el código que descargué de CodePlex, pero en un ensamble separado, y solo en fuente, no en forma binaria. (¿Esto significa que no es una parte del MEF? O lo que es el punto de ponerla en un proyecto separado?) Entonces, me di cuenta de que es para Silverlight, por lo que en realidad no me ayuda. (¿O debería simplemente compilar eso contra .NET 3.5, o incluirlo en mi proyecto, y estoy listo para ir?)

Así que ahora tengo un problema que es el siguiente: ¿dónde debería poner el CompositionContainer en mi aplicación?

Hay otra cosa que me gustaría tener en cuenta: ¿debo usar solo un CompositionContainer durante la vida de la aplicación, o prefiero crear un contenedor para cada momento cuando lo necesito?

Respuesta

11

buenas preguntas.

En general, en términos de preguntas acerca de dónde colocar el recipiente, recomiendo los siguientes mensajes: http://blogs.msdn.com/nblumhardt/archive/tags/Container+Managed+Application+Design/default.aspx

En del MEF en la web, aplicaciones basadas en la Web son una Tricker poco debido a la naturaleza de solicitud/respuesta y preocupaciones de escalabilidad. En el caso de la web, es probable que desee tener una jerarquía de contenedores, una raíz para la aplicación que se comparte, así como contenedores para niños por solicitud. Los contenedores para niños deben vivir y morir con la solicitud para conservar recursos. El contenedor compartido contiene servicios que comparten todas las personas que llaman.

Es posible que echa un vistazo a estos artículos para obtener más información sobre cómo hacer esto:

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

En lo que PartInitializer, evitaría el uso de algo parecido a menos que tenga que hacerlo. ASP.NET proporciona suficientes enlaces en la canalización a través de manejadores HTTP, módulos y otros para permitir componer automáticamente en la creación.

El único lugar me gustaría ver el uso de PI en la web sería posiblemente dentro de un control de usuario personalizado. PI se envía como parte de Silverlight 4 y no está disponible en el cuadro para .NET 4.0.He creado una versión utilizable para .NET 4.0, que se puede encontrar aquí: http://cid-f8b2fd72406fb218.skydrive.live.com/self.aspx/blog/Composition.Initialization.Desktop.zip

HTH Glenn

Cuestiones relacionadas