asp net mvc 3 ubicación servicio

Upload: marco-antonio-monzon-lazcano

Post on 10-Feb-2018

235 views

Category:

Documents


0 download

TRANSCRIPT

  • 7/22/2019 ASP NET MVC 3 Ubicacin Servicio

    1/33

    ASP.NET MVC 3

    Ubicacin Servicio

  • 7/22/2019 ASP NET MVC 3 Ubicacin Servicio

    2/33

    i

    Tabla de contenido

    ASP.NET MVC 3 Ubicacin Servicio, Parte 1: Introduccin.............................................. 1Index Series............................................................................................................................... 1Actualizacin importante.......................................................................................................... 1

    Introduccin.............................................................................................................................. 1

    Renuncia.................................................................................................................................... 1Estrategia General..................................................................................................................... 1

    1. Localizacin de un servicio separado registrado............................................................... 22. Localizacin de un servicio se multiplican registrado...................................................... 23. Creacin de objetos arbitrarios.......................................................................................... 3

    IMvcServiceLocator y MvcServiceLocator.............................................................................. 3No Configuracin...................................................................................................................... 4Complejas necesidades de Inyeccin de Dependencia.............................................................. 4Pregunta abierta: A Common Service Locator o no?................................................................ 4

    ASP.NET MVC 3 Ubicacin Servicio, Parte 2: Controladores............................................ 5Index Series............................................................................................................................... 5Actualizacin importante.......................................................................................................... 5Creacin Controller................................................................................................................... 5Renuncia.................................................................................................................................... 5Ubicacin: IControllerFactory.................................................................................................. 6Instancias del controlador: Ubicacin....................................................................................... 8Qu sigue?............................................................................................................................... 9UnityMvcServiceLocator.cs...................................................................................................... 9

    ASP.NET MVC 3 Ubicacin Servicio, Parte 3: Ver Motores / Ver pginas...................... 10Index Series............................................................................................................................. 10Actualizacin importante........................................................................................................ 10Registro de vista motor y Ver Pgina Creacin...................................................................... 10Renuncia.................................................................................................................................. 11Ubicacin: View Motores....................................................................................................... 11Ubicacin: Ver pginas........................................................................................................... 12

    ASP.NET MVC 3 Ubicacin Servicio, Parte 4: Filtros...................................................... 13Index Series............................................................................................................................. 13Actualizacin importante........................................................................................................ 13Filtros y filtro Proveedores...................................................................................................... 13Renuncia.................................................................................................................................. 13Ubicacin: Filtrar Proveedores................................................................................................ 13Implementar un proveedor de Filtro........................................................................................ 14Filtro Orden............................................................................................................................. 14La implementacin de un filtro............................................................................................... 15Registro de un filtro global...................................................................................................... 16Adicin de Inyeccin de Dependencia a Filtros...................................................................... 16

    ASP.NET MVC 3 Ubicacin Servicio, Parte 5: IDependencyResolver............................. 19Index Series............................................................................................................................. 19Novedades Desde Preview 1?................................................................................................. 19Renuncia.................................................................................................................................. 19IDependencyResolver............................................................................................................. 19DependencyResolver............................................................................................................... 20Los mtodos de extensin para IDependencyResolver........................................................... 21Diferencias entre IDependencyResolver y Common Servicio de Busqueda.......................... 21

    ASP.NET MVC 3 Ubicacin Servicio, Parte 6: Validacin del Modelo............................ 21Index Series............................................................................................................................. 21

  • 7/22/2019 ASP NET MVC 3 Ubicacin Servicio

    3/33

    ii

    Modelo validadores................................................................................................................. 22Renuncia.................................................................................................................................. 22Escribir un Proveedor Validator.............................................................................................. 22Ubicacin: ModelValidatorProvider....................................................................................... 22

    ASP.NET MVC 3 Servicio Ubicacin, Parte 7: Modelo de Metadatos.............................. 22

    Index Series............................................................................................................................. 22

    Modelo de Metadatos.............................................................................................................. 23Renuncia.................................................................................................................................. 23Escribir un proveedor de metadatos........................................................................................ 23Ubicacin: ModelMetadataProvider....................................................................................... 23

    ASP.NET MVC 3 Servicio Ubicacin, Parte 8: Proveedores de Valor.............................. 24Index Series............................................................................................................................. 24Proveedores de Valor.............................................................................................................. 24Renuncia.................................................................................................................................. 24Implementar ValueProviderFactory........................................................................................ 24Implementar IValueProvider................................................................................................... 24

    Ubicacin: ValueProviderFactory........................................................................................... 25

    ASP.NET MVC 3 Ubicacin Servicio, Parte 9: Carpetas Modelo..................................... 25Index Series............................................................................................................................. 25Carpetas Modelo..................................................................................................................... 25Renuncia.................................................................................................................................. 26Implementar IModelBinderProvider....................................................................................... 26Ubicacin: IModelBinderProvider.......................................................................................... 26

    ASP.NET MVC 3 Ubicacin Servicio, Parte 10: Controlador Activador.......................... 27Index Series............................................................................................................................. 27Activador Controller............................................................................................................... 27Renuncia.................................................................................................................................. 27

    Implementar IControllerActivator........................................................................................... 27

    Ubicacin: IControllerActivator............................................................................................. 28ASP.NET MVC 3 Servicio Ubicacin, Parte 11: Ver Pgina Activador............................ 28

    Index Series............................................................................................................................. 28Ver Pgina Activador.............................................................................................................. 28Renuncia.................................................................................................................................. 29Nueva Clase Base: BuildManagerCompiledView.................................................................. 29Implementar IViewPageActivator........................................................................................... 29Ubicacin: IViewPageActivator............................................................................................. 30Qu sigue?............................................................................................................................. 30

  • 7/22/2019 ASP NET MVC 3 Ubicacin Servicio

    4/33

    1

    ASP.NET MVC 3 Ubicacin Servicio, Parte 1: IntroduccinIndex Series Parte 1: Introduccin Parte 2: Controladores Parte 3: Ver Motores y Ver pginas Parte 4: Filtros Parte 5: IDependencyResolver Parte 6: Validacin del Modelo Parte 7: Modelo de Metadatos Proveedores de Valor: Parte 8 Carpetas Modelo: Parte 9 Parte 10: Controlador Activador Parte 11: Ver Pgina Activador

    Actualizacin importanteHemos hecho cambios signi f icativos en el apoyo de la COI en ASP.NET MVC 3

    Beta. Por favor, leala Parte 5para ms informacin.

    IntroduccinUna de las nuevas caractersticas de ASP.NET MVC 3 es la posibilidad de registrar un

    localizador de servicios que ser utilizado por el marco. Las versiones anteriores del

    marco MVC han ofrecido oportunidades para la introduccin de conceptos como la

    ubicacin del servicio y la inyeccin de dependencias (DI), en MVC 3, hemos

    formalizado el proceso y ha abierto varias nuevas oportunidades para los

    desarrolladores.

    Este primer post de la serie discutir la estrategia general para la ubicacin del servicioen MVC 3. Mensajes posteriores se discutir maneras especficas para llevar a cabo la

    ubicacin del servicio y DI con caractersticas nuevas y existentes.

    RenunciaEste blog habla de ASP.NET MVC 3 Preview 1, que es una versin preliminar.Detalles

    tcnicos especficos pueden cambiar antes del lanzamiento final de MVC 3.Esta versin

    est diseada para obtener retroalimentacin sobre las caractersticas con el tiempo

    suficiente para hacer cambios significativos antes de MVC 3 naves, as que por favor

    comentar sobre esta entrada del blog, opngase en contacto conmigosi usted tiene

    comentarios.

    Estrategia GeneralLa parte ms importante de la estrategia con la ubicacin del servicio es que va a ser

    opcional. Esto significa que si usted no est interesado en el trabajo con un localizador

    de servicios, usted no ver obligado a. Siempre vamos a ofrecer una manera de llevar a

    cabo funciones de personalizacin sin necesidad de utilizar un localizador de

    servicios. Tambin vamos a trabajar para preservar la compatibilidad hacia atrs tanto

    como sea posible en la introduccin de nueva capacidad de ubicacin de servicio en las

    caractersticas existentes de MVC.

    http://bradwilson.typepad.com/blog/2010/07/service-location-pt2-controllers.htmlhttp://bradwilson.typepad.com/blog/2010/07/service-location-pt2-controllers.htmlhttp://bradwilson.typepad.com/blog/2010/07/service-location-pt3-views.htmlhttp://bradwilson.typepad.com/blog/2010/07/service-location-pt3-views.htmlhttp://bradwilson.typepad.com/blog/2010/07/service-location-pt4-filters.htmlhttp://bradwilson.typepad.com/blog/2010/07/service-location-pt4-filters.htmlhttp://bradwilson.typepad.com/blog/2010/10/service-location-pt5-idependencyresolver.htmlhttp://bradwilson.typepad.com/blog/2010/10/service-location-pt5-idependencyresolver.htmlhttp://bradwilson.typepad.com/blog/2010/10/service-location-pt6-model-validation.htmlhttp://bradwilson.typepad.com/blog/2010/10/service-location-pt6-model-validation.htmlhttp://bradwilson.typepad.com/blog/2010/10/service-location-pt7-model-metadata.htmlhttp://bradwilson.typepad.com/blog/2010/10/service-location-pt7-model-metadata.htmlhttp://bradwilson.typepad.com/blog/2010/10/service-location-pt8-value-providers.htmlhttp://bradwilson.typepad.com/blog/2010/10/service-location-pt8-value-providers.htmlhttp://bradwilson.typepad.com/blog/2010/10/service-location-pt9-model-binders.htmlhttp://bradwilson.typepad.com/blog/2010/10/service-location-pt9-model-binders.htmlhttp://bradwilson.typepad.com/blog/2010/10/service-location-pt10-controller-activator.htmlhttp://bradwilson.typepad.com/blog/2010/10/service-location-pt10-controller-activator.htmlhttp://bradwilson.typepad.com/blog/2010/10/service-location-pt11-view-page-activator.htmlhttp://bradwilson.typepad.com/blog/2010/10/service-location-pt11-view-page-activator.htmlhttp://bradwilson.typepad.com/blog/2010/10/service-location-pt5-idependencyresolver.htmlhttp://bradwilson.typepad.com/blog/2010/10/service-location-pt5-idependencyresolver.htmlhttp://bradwilson.typepad.com/blog/2010/10/service-location-pt5-idependencyresolver.htmlhttp://bradwilson.typepad.com/about.htmlhttp://bradwilson.typepad.com/about.htmlhttp://bradwilson.typepad.com/about.htmlhttp://bradwilson.typepad.com/about.htmlhttp://bradwilson.typepad.com/blog/2010/10/service-location-pt5-idependencyresolver.htmlhttp://bradwilson.typepad.com/blog/2010/10/service-location-pt11-view-page-activator.htmlhttp://bradwilson.typepad.com/blog/2010/10/service-location-pt10-controller-activator.htmlhttp://bradwilson.typepad.com/blog/2010/10/service-location-pt9-model-binders.htmlhttp://bradwilson.typepad.com/blog/2010/10/service-location-pt8-value-providers.htmlhttp://bradwilson.typepad.com/blog/2010/10/service-location-pt7-model-metadata.htmlhttp://bradwilson.typepad.com/blog/2010/10/service-location-pt6-model-validation.htmlhttp://bradwilson.typepad.com/blog/2010/10/service-location-pt5-idependencyresolver.htmlhttp://bradwilson.typepad.com/blog/2010/07/service-location-pt4-filters.htmlhttp://bradwilson.typepad.com/blog/2010/07/service-location-pt3-views.htmlhttp://bradwilson.typepad.com/blog/2010/07/service-location-pt2-controllers.html
  • 7/22/2019 ASP NET MVC 3 Ubicacin Servicio

    5/33

    2

    Cuando se utiliza el localizador de servicio registrada, MVC generalmente emplean una

    de las tres estrategias, dependiendo del tipo de trabajo que est tratando de hacer.

    1. Localizacin de un servicio separado registradoHay varios servicios que MVC utiliza hoy en da que tienen la capacidad para registrar

    un solo caso de un servicio de este tipo. Un ejemplo es la fbrica de controlador, queimplementa IControllerFactory. Hay una sola fbrica de controlador que se utiliza para

    toda la aplicacin.

    Cuando MVC intenta usar un servicio separado registrado, primero le pedir el

    localizador de servicios si tiene una instancia de ese servicio. Si lo hace, entonces MVC

    usar eso, si no lo hace, entonces se recurrir a la inscripcin singleton que est

    disponible para los usuarios de localizacin distintos de los servicios.

    La ventaja de esto significa que no se les requerir a los usuarios del localizador de

    servicios para llenar su localizador / contenedor con todos los servicios predeterminados

    existentes utilizadas por MVC, porque caer automticamente a estos valores pordefecto cuando no existe nada en el localizador. La desventaja potencial de este medio

    que es tericamente posible registrar un servicio personalizado en ambos lugares, pero

    slo el que est en el localizador se utilizar.

    2. Localizacin de un servicio se multiplican registradoHay varios servicios que MVC utiliza hoy en da que tienen la capacidad de registrar

    varias instancias de un servicio de este tipo. Un ejemplo de esto es el motor de la vista,

    que implementa IViewEngine. Tpicamente, MVC ofrece un punto de registro que acta

    como una lista de este tipo de servicios, y tambin ofrece una API que acta como una

    fachada y se da cuenta de la forma adecuada para hacer el trabajo.En el caso de motoresde vista, esta fachada (ViewEngines.Engines) toma la forma de "ir a cada motor de la

    vista en la lista y pedir por el fin hasta que uno de ellos puede proporcionarla". Tambin

    hay servicios de multiplicar registrados donde la fachada utiliza todos los servicios

    (ModelValidatorProviders.Providers) y los agregados de todas las respuestas juntos.

    Cuando MVC intenta usar un servicio de multiplicar registrado, que seguir pidiendo la

    fachada de recogida para hacer el trabajo. La fachada coleccin usar tanto los casos

    estticamente registrados del servicio, as como cualquiera de los casos registrados en el

    localizador de servicios, y los combina juntos en la forma que sea ms apropiada para la

    fachada. Cuando la orden de servicio es importante (como con motores de vista, por

    ejemplo), esto por lo general significa que los casos de localizacin de servicios vendrn

    ante las instancias estticamente registrados.

    Al igual que la estrategia de registro nico, la ventaja de esto significa que no se les

    requerir a los usuarios del localizador de servicios para llenar su localizador /

    contenedor con las instancias de servicio por defecto existentes. La desventaja potencial

    de esto es que la mayora de los contenedores no ofrecen una funcin ordenadora nativo

    para mltiples registro de servicios, por lo que el orden es importante, puede ser

    necesario el uso de las API de localizacin distintos de los servicios. En la prctica, sinembargo, probablemente no ser un gran problema, ya que la mayora de aplicaciones

  • 7/22/2019 ASP NET MVC 3 Ubicacin Servicio

    6/33

    3

    por lo general no necesitan depender de ordenacin (por ejemplo, van a utilizar

    principalmente slo un nico motor de la vista), especialmente dado que los servicios de

    localizacin de servicios en general, van antes de que los servicios de pre-registradas

    existentes.

    3. Creacin de objetos arbitrariosLa forma final que MVC puede utilizar un localizador de servicios es en la creacin deobjetos arbitrarios. (Aqu es donde nos desviamos de la funcionalidad estrictamente

    local de servicio y lo usamos ms como un contenedor de inyeccin de dependencia.)

    Donde hemos encontrado conveniente que un objeto que creamos puede estar en

    necesidad de la inyeccin de dependencia de los servicios, se intentar crear ese objeto a

    travs del localizador de servicios. Un ejemplo es objetos del controlador, lo que puede

    que desee tener dependencias de servicios para hacer su trabajo.

    Cuando MVC intenta crear un objeto arbitrario de esta manera, se le pedir el

    localizador de servicios para crear el objeto en su nombre. Si el localizador de serviciosno puede cumplir con esta creacin del objeto, por lo general recurrir a la conducta

    existente en las versiones anteriores de MVC 2, por lo general, esto significa llamar

    Activator.CreateInstance.

    IMvcServiceLocator y MvcServiceLocatorPara habilitar la ubicacin del servicio de MVC, hemos introducido una nueva interfaz

    (IMvcServiceLocator) y una nueva clase de registro singleton esttico

    (MvcServiceLocator). Para Preview 1, tambin hemos replicado el vigenteComn

    Servicio de Busquedainterfaz (IServiceLocator) y clase de excepcin

    (ActivationException) en el espacio de nombres System.Web.Mvc.?

    123456789

    101112131415161718

    public interface IServiceLocator : IServiceProvider {IEnumerable GetAllInstances();IEnumerable GetAllInstances(Type serviceType);TService GetInstance();TService GetInstance(string key);object GetInstance(Type serviceType);object GetInstance(Type serviceType, string key);

    }

    public interface IMvcServiceLocator : IServiceLocator {void Release(object instance);

    }

    public static class MvcServiceLocator {public static IMvcServiceLocator Current { get; }public static IMvcServiceLocator Default { get; }public static void SetCurrent(IServiceLocator locator);

    }

    El punto de registro es MvcServiceLocator.SetCurrent (), y slo requiere que el

    localizador de servicios para apoyar IServiceLocator. Sin embargo, te dars cuenta de

    que MvcServiceLocator.Current siempre devuelve una implementacin de

    http://commonservicelocator.codeplex.com/http://commonservicelocator.codeplex.com/http://commonservicelocator.codeplex.com/http://commonservicelocator.codeplex.com/http://bradwilson.typepad.com/blog/2010/07/service-location-pt1-introduction.htmlhttp://bradwilson.typepad.com/blog/2010/07/service-location-pt1-introduction.htmlhttp://bradwilson.typepad.com/blog/2010/07/service-location-pt1-introduction.htmlhttp://commonservicelocator.codeplex.com/http://commonservicelocator.codeplex.com/
  • 7/22/2019 ASP NET MVC 3 Ubicacin Servicio

    7/33

    4

    IMvcServiceLocator. Vamos a crear automticamente la aplicacin de

    IMvcServiceLocator.Release () si no existe uno, que llamar a Dispose en el objeto si se

    implementa IDisposable.

    Tambin vale la pena destacar que siempre habr un localizador de servicios

    disponibles, incluso si usted nunca ha registrado una. Nuestro localizador de serviciopor defecto no es un localizador de servicios de pleno derecho, ya que slo se llama

    Activator.CreateInstance y no ofrece ningn sistema de registro. No pretende ser un

    sustituto de un localizador de servicios de bienes o dependencia contenedor de

    inyeccin.

    No ConfiguracinEl uso de MVC de ubicacin del servicio se limita a la recuperacin de los

    servicios.MVC no tiene ninguna necesidad de configurar el localizador de servicios

    existente.Como tal, hemos hecho ningn esfuerzo para ocultar el proceso de

    configuracin / registro inherente a los localizadores de servicios existentes ocontenedores DI.

    Creemos que la mayora de la gente va a elegir el contenedor que desean utilizar la base

    de sus APIs de registro y configuracin, as que tratar de ocultarlos seran

    contraproducentes.

    Complejas necesidades de Inyeccin de DependenciaUna pregunta comn podra ser por qu se opt por utilizar Common Service Locator,

    cuando muchos contenedores ofrecen la posibilidad de disponer de sistemas de

    inyeccin de dependencia muy complejas (por ejemplo, contenedores anidados degestin de vida vinculados a solicitar toda la vida).

    Siempre que sea posible, vamos a seguir ofreciendo servicios de estilo fbrica para

    permitir que las necesidades de inyeccin de dependencia complejas. Por ejemplo,

    vamos a seguir para ofrecer IControllerFactory como un servicio, a pesar de que la

    mayora de los usuarios podrn acaba de registrar su localizador de servicios sin

    necesidad de proporcionar una fbrica de controlador personalizado ms. Si usted

    necesita la gestin de toda la vida compleja, sin embargo, todava puede optar por

    proporcionar una fbrica de controladores que le da la flexibilidad para abrir las

    opciones de creacin de complejos.Pregunta abierta: A Common Service Locator o no?Para Preview 1, se decidi no enviar el archivo DLL real Common Service Locator

    (CSL). Esta decisin fue impulsado principalmente por el horario.

    Actualmente estamos debatiendo internamente sobre si procede o no tomar la

    dependencia de CSL. La ventaja sera que los usuarios de contenedores seran capaces

    de aprovechar las implementaciones existentes de CSL que la mayora de los

    contenedores de inyeccin de dependencia vienen con (aunque habra que aadir la

    aplicacin de IMvcServiceLocator, si se desea). La desventaja es que crea una

    dependencia en tiempo de ejecucin en una DLL adicional que no es probable que sea

  • 7/22/2019 ASP NET MVC 3 Ubicacin Servicio

    8/33

    5

    en la mquina del desarrollador o en el servidor, ya que CSL no es parte de. NET

    Framework. Esto complica un poco la historia de despliegue bin para MVC mediante la

    adicin de una nueva DLL recordar desplegar, lo que tiene que estar en su lugar si el

    usuario utiliza un localizador de servicios o no.

    Adems, est la cuestin de la falta de CSL del mtodo de lanzamiento, lo que hemosaadido a IMvcServiceLocator, y el asunto del mandato que las implementaciones de

    CSL lanzan excepciones en lugar de devolver nulo cuando no se puede encontrar una

    implementacin de un servicio especfico, que podra causar verdadero problemas de

    rendimiento en tiempo de ejecucin.

    Cules son sus pensamientos? Hay que incluir una referencia a la CSL, o se est

    replicando la interfaz lo suficientemente bueno? Debemos tratar de encontrar una

    forma para apoyar tanto, con lo que la referencia CSL opcional y slo es necesaria

    cuando el desarrollador utiliza el CSL?

    ASP.NET MVC 3 Ubicacin Servicio, Parte 2: ControladoresIndex Series Parte 1: Introduccin Parte 2: Controladores Parte 3: Ver Motores y Ver pginas Parte 4: Filtros Parte 5: IDependencyResolver Parte 6: Validacin del Modelo Parte 7: Modelo de Metadatos Proveedores de Valor: Parte 8 Carpetas Modelo: Parte 9 Parte 10: Controlador Activador Parte 11: Ver Pgina Activador

    Actualizacin importanteHemos hecho cambios signi f icativos en el apoyo de la COI en ASP.NET MVC 3

    Beta. Por favor, leala Parte 5para ms informacin.

    Creacin ControllerLa forma ms comn de la ubicacin del servicio de hoy en ASP.NET MVC es para la

    creacin de controlador. En MVC 1.0, hemos creado una interfaz

    denominadaIControllerFactoryque es responsable de la ubicacin y la creacin de

    controladores. Esta interfaz se introdujo con el deseo explcito de apoyar la inyeccin de

    dependencia de los controladores.

    ACTUALI ZACIN:(31 de julio de 2010) he aadido el cdigo fuente de

    UnityMvcServiceLocator alfinal de este post.

    RenunciaEste blog habla de ASP.NET MVC 3 Preview 1, que es una versin preliminar.Detalles

    tcnicos especficos pueden cambiar antes del lanzamiento final de MVC 3.Esta versin

    est diseada para obtener retroalimentacin sobre las caractersticas con el tiemposuficiente para hacer cambios significativos antes de MVC 3 naves, as que por favor

    http://bradwilson.typepad.com/blog/2010/07/service-location-pt1-introduction.htmlhttp://bradwilson.typepad.com/blog/2010/07/service-location-pt1-introduction.htmlhttp://bradwilson.typepad.com/blog/2010/07/service-location-pt3-views.htmlhttp://bradwilson.typepad.com/blog/2010/07/service-location-pt3-views.htmlhttp://bradwilson.typepad.com/blog/2010/07/service-location-pt4-filters.htmlhttp://bradwilson.typepad.com/blog/2010/07/service-location-pt4-filters.htmlhttp://bradwilson.typepad.com/blog/2010/10/service-location-pt5-idependencyresolver.htmlhttp://bradwilson.typepad.com/blog/2010/10/service-location-pt5-idependencyresolver.htmlhttp://bradwilson.typepad.com/blog/2010/10/service-location-pt6-model-validation.htmlhttp://bradwilson.typepad.com/blog/2010/10/service-location-pt6-model-validation.htmlhttp://bradwilson.typepad.com/blog/2010/10/service-location-pt7-model-metadata.htmlhttp://bradwilson.typepad.com/blog/2010/10/service-location-pt7-model-metadata.htmlhttp://bradwilson.typepad.com/blog/2010/10/service-location-pt8-value-providers.htmlhttp://bradwilson.typepad.com/blog/2010/10/service-location-pt8-value-providers.htmlhttp://bradwilson.typepad.com/blog/2010/10/service-location-pt9-model-binders.htmlhttp://bradwilson.typepad.com/blog/2010/10/service-location-pt9-model-binders.htmlhttp://bradwilson.typepad.com/blog/2010/10/service-location-pt10-controller-activator.htmlhttp://bradwilson.typepad.com/blog/2010/10/service-location-pt10-controller-activator.htmlhttp://bradwilson.typepad.com/blog/2010/10/service-location-pt11-view-page-activator.htmlhttp://bradwilson.typepad.com/blog/2010/10/service-location-pt11-view-page-activator.htmlhttp://bradwilson.typepad.com/blog/2010/10/service-location-pt5-idependencyresolver.htmlhttp://bradwilson.typepad.com/blog/2010/10/service-location-pt5-idependencyresolver.htmlhttp://bradwilson.typepad.com/blog/2010/10/service-location-pt5-idependencyresolver.htmlhttp://msdn.microsoft.com/en-us/library/system.web.mvc.icontrollerfactory.aspxhttp://msdn.microsoft.com/en-us/library/system.web.mvc.icontrollerfactory.aspxhttp://msdn.microsoft.com/en-us/library/system.web.mvc.icontrollerfactory.aspxhttp://bradwilson.typepad.com/blog/2010/07/service-location-pt2-controllers.html#unityservicelocatorhttp://bradwilson.typepad.com/blog/2010/07/service-location-pt2-controllers.html#unityservicelocatorhttp://bradwilson.typepad.com/blog/2010/07/service-location-pt2-controllers.html#unityservicelocatorhttp://bradwilson.typepad.com/blog/2010/07/service-location-pt2-controllers.html#unityservicelocatorhttp://msdn.microsoft.com/en-us/library/system.web.mvc.icontrollerfactory.aspxhttp://bradwilson.typepad.com/blog/2010/10/service-location-pt5-idependencyresolver.htmlhttp://bradwilson.typepad.com/blog/2010/10/service-location-pt11-view-page-activator.htmlhttp://bradwilson.typepad.com/blog/2010/10/service-location-pt10-controller-activator.htmlhttp://bradwilson.typepad.com/blog/2010/10/service-location-pt9-model-binders.htmlhttp://bradwilson.typepad.com/blog/2010/10/service-location-pt8-value-providers.htmlhttp://bradwilson.typepad.com/blog/2010/10/service-location-pt7-model-metadata.htmlhttp://bradwilson.typepad.com/blog/2010/10/service-location-pt6-model-validation.htmlhttp://bradwilson.typepad.com/blog/2010/10/service-location-pt5-idependencyresolver.htmlhttp://bradwilson.typepad.com/blog/2010/07/service-location-pt4-filters.htmlhttp://bradwilson.typepad.com/blog/2010/07/service-location-pt3-views.htmlhttp://bradwilson.typepad.com/blog/2010/07/service-location-pt1-introduction.html
  • 7/22/2019 ASP NET MVC 3 Ubicacin Servicio

    9/33

    6

    comentar sobre esta entrada del blog, opngase en contacto conmigosi usted tiene

    comentarios.

    Ubicacin: IControllerFactoryEsto es un "separado registrada" servicio de estilo introducido en MVC 1.0. El punto de

    registro esttico de este servicio estenControllerBuilder.Current.SetControllerFactorypara usuarios no DI.

    La lgica en ControllerBuilder fue actualizado para tratar de encontrar

    IControllerFactory primero llamando MvcServiceLocator.Current.GetInstance

    (). Si el servicio no existe en el localizador de servicios, entonces

    cae de nuevo al punto de registro esttico. El IControllerFactory defecto

    permaneceDefaultControllerFactory.

    El siguiente es un ejemplo de implementacin de una fbrica de controladores,

    utilizandoMicrosoft Unidadcomo el contenedor de inyeccin de dependencia:?12345678910

    111213141516171819202122

    2324252627282930313233

    using System;using System.Web.Mvc;using System.Web.Routing;using Microsoft.Practices.Unity;

    public class UnityControllerFactory : IControllerFactory {private IUnityContainer _container;private IControllerFactory _innerFactory;

    public UnityControllerFactory(IUnityContainer container)

    : this(container, new DefaultControllerFactory()) {}

    protected UnityControllerFactory(IUnityContainer container,IControllerFactory innerFactory) {

    _container = container;_innerFactory = innerFactory;

    }

    public IController CreateController(RequestContext requestContext,string controllerName) {

    try {

    return _container.Resolve(controllerName.ToLowerInvariant());}catch (Exception) {

    return _innerFactory.CreateController(requestContext, controllerName);}

    }

    public void ReleaseController(IController controller) {_container.Teardown(controller);

    }}

    Delega creacin de controladores a una fbrica de controladores interior cuando el

    recipiente no contiene el controlador en cuestin (en este caso, se utiliza el

    http://bradwilson.typepad.com/about.htmlhttp://bradwilson.typepad.com/about.htmlhttp://bradwilson.typepad.com/about.htmlhttp://msdn.microsoft.com/en-us/library/system.web.mvc.controllerbuilder.setcontrollerfactory.aspxhttp://msdn.microsoft.com/en-us/library/system.web.mvc.controllerbuilder.setcontrollerfactory.aspxhttp://msdn.microsoft.com/en-us/library/system.web.mvc.defaultcontrollerfactory.aspxhttp://msdn.microsoft.com/en-us/library/system.web.mvc.defaultcontrollerfactory.aspxhttp://msdn.microsoft.com/en-us/library/system.web.mvc.defaultcontrollerfactory.aspxhttp://unity.codeplex.com/http://unity.codeplex.com/http://unity.codeplex.com/http://bradwilson.typepad.com/blog/2010/07/service-location-pt2-controllers.htmlhttp://bradwilson.typepad.com/blog/2010/07/service-location-pt2-controllers.htmlhttp://bradwilson.typepad.com/blog/2010/07/service-location-pt2-controllers.htmlhttp://unity.codeplex.com/http://msdn.microsoft.com/en-us/library/system.web.mvc.defaultcontrollerfactory.aspxhttp://msdn.microsoft.com/en-us/library/system.web.mvc.controllerbuilder.setcontrollerfactory.aspxhttp://bradwilson.typepad.com/about.html
  • 7/22/2019 ASP NET MVC 3 Ubicacin Servicio

    10/33

    7

    DefaultControllerFactory como valor predeterminado de fbrica del controlador

    interno). Esto nos permite registrar los controladores por su nombre, en lugar de

    ajustando con la cadena controlador a un nombre del tipo:

    CustomNamed.cs?12345

    public class CustomNamed : Controller {public ActionResult Index() {

    return View();}

    }

    Global.asax.cs?123

    45678910111213

    public class MvcApplication : HttpApplication {protected void Application_Start() {

    // ...

    var container = new UnityContainer();container.RegisterType("admin");

    var factory = new UnityControllerFactory(container);ControllerBuilder.Current.SetControllerFactory(factory);

    // ...}

    }

    Debido a nuestra fbrica controlador personalizado, ahora cada vez que la URL ha

    "admin" por su controlador, que va a terminar usando una instancia de la claseCustomNamed. Porque tenemos nuestra propia fbrica de controlador personalizado, no

    necesitar seguir las convenciones de MVC por defecto para clases de controlador.

    En el ejemplo anterior, se utiliz el punto de registro esttico existente para las fbricas

    de controlador. Tambin podramos haber escrito Application_Start () as:

    Global.asax.cs?

    123

    4567891011121314

    public class MvcApplication : HttpApplication {protected void Application_Start() {

    // ...

    var container = new UnityContainer();var factory = new UnityControllerFactory(container);container.RegisterInstance(factory);container.RegisterType("admin");

    MvcServiceLocator.SetCurrent(new UnityMvcServiceLocator(container));

    // ...}

    }

    Ahora MVC est recibiendo la fbrica de controladores desde el localizador de serviciosen lugar del punto de registro esttico. Aunque todava estamos creando la fbrica a

    http://bradwilson.typepad.com/blog/2010/07/service-location-pt2-controllers.htmlhttp://bradwilson.typepad.com/blog/2010/07/service-location-pt2-controllers.htmlhttp://bradwilson.typepad.com/blog/2010/07/service-location-pt2-controllers.htmlhttp://bradwilson.typepad.com/blog/2010/07/service-location-pt2-controllers.htmlhttp://bradwilson.typepad.com/blog/2010/07/service-location-pt2-controllers.htmlhttp://bradwilson.typepad.com/blog/2010/07/service-location-pt2-controllers.htmlhttp://bradwilson.typepad.com/blog/2010/07/service-location-pt2-controllers.htmlhttp://bradwilson.typepad.com/blog/2010/07/service-location-pt2-controllers.htmlhttp://bradwilson.typepad.com/blog/2010/07/service-location-pt2-controllers.html
  • 7/22/2019 ASP NET MVC 3 Ubicacin Servicio

    11/33

    8

    mano en el ejemplo anterior, nos abrimos a la posibilidad de permitir que el recipiente a

    crear la fbrica de controladores para nosotros, incluyendo la obtencin de la inyeccin

    de dependencia durante la creacin de cualquier servicio que pueda necesitar para su

    uso.

    Instancias del controlador: UbicacinEsta es una nueva caracterstica para MVC 3. El framework MVC (en concreto,elDefaultControllerFactoryclase) ha sido actualizado para tratar de crear todas las

    instancias del controlador con el localizador de servicio registrada. Si la creacin falla,

    entonces se recurrir a la conducta pre-MVC 3 de utilizar Activator.CreateInstance.

    Una vez ms el uso de la Unidad como nuestro ejemplo contenedor, vamos a suponer

    que tenemos el siguiente cdigo:

    IMathService.cs?123

    public interface IMathService {int Add(int left, int right);

    }

    MathService.cs?12345

    public class MathService : IMathService {public int Add(int left, int right) {

    return left + right;}

    }

    HomeController.cs

    ?12345678910

    111213

    using System.Web.Mvc;

    public class HomeController : Controller {IMathService _mathService;

    public HomeController(IMathService mathService) {_mathService = mathService;

    }

    public ActionResult Index() {

    return View(_mathService.Add(3, 6));}

    }

    Lo que estamos creado es una interfaz de servicio, una implementacin de la interfaz

    que queremos utilizar en tiempo de ejecucin, y un controlador que lo consume.

    El controlador tiene la dependencia para IMathService de su constructor. No s qu

    instancia de IMathService que va a conseguir, y que en realidad no importa. Este tipo de

    inyeccin de dependencia se denomina "inyeccin de constructor", y es una forma

    bastante comn de hacer DI.

    Debido a que hemos reducido la dependencia entre HomeController y MathService, noshemos hecho ms fcil que cambiar el servicio que vamos a utilizar, as como por lo que

    http://msdn.microsoft.com/en-us/library/system.web.mvc.defaultcontrollerfactory.aspxhttp://msdn.microsoft.com/en-us/library/system.web.mvc.defaultcontrollerfactory.aspxhttp://msdn.microsoft.com/en-us/library/system.web.mvc.defaultcontrollerfactory.aspxhttp://bradwilson.typepad.com/blog/2010/07/service-location-pt2-controllers.htmlhttp://bradwilson.typepad.com/blog/2010/07/service-location-pt2-controllers.htmlhttp://bradwilson.typepad.com/blog/2010/07/service-location-pt2-controllers.htmlhttp://bradwilson.typepad.com/blog/2010/07/service-location-pt2-controllers.htmlhttp://bradwilson.typepad.com/blog/2010/07/service-location-pt2-controllers.htmlhttp://bradwilson.typepad.com/blog/2010/07/service-location-pt2-controllers.htmlhttp://bradwilson.typepad.com/blog/2010/07/service-location-pt2-controllers.htmlhttp://bradwilson.typepad.com/blog/2010/07/service-location-pt2-controllers.htmlhttp://bradwilson.typepad.com/blog/2010/07/service-location-pt2-controllers.htmlhttp://msdn.microsoft.com/en-us/library/system.web.mvc.defaultcontrollerfactory.aspx
  • 7/22/2019 ASP NET MVC 3 Ubicacin Servicio

    12/33

    9

    es ms fcil de probar HomeController ahora. Durante las pruebas de unidad que

    podemos ofrecer una maqueta de IMathService al controlador.

    Para completar el proceso de registro para que todo se cablea automticamente en

    tiempo de ejecucin, vamos a crear el contenedor de la Unidad y decimos que "cada vez

    que algo le pide IMathService, le dan una instancia de MathService":Global.asax.cs?

    12345678

    9

    protected void Application_Start() {// ...

    var container = new UnityContainer();container.RegisterType();MvcServiceLocator.SetCurrent(new UnityMvcServiceLocator(container));

    // ...

    }Al igual que muchos marcos DI, la Unidad no requiere una configuracin explcita para

    hacer objetos arbitrarios. Inyeccin de Constructor es apoyado de forma automtica. No

    tenemos una sola lnea de configuracin en el contenedor que sepa algo de

    HomeController. Unidad analizar la solicitud para la construccin de HomeController,

    ver que su constructor requiere un IMathService y recursiva determinar cmo construir

    eso. Si, por ejemplo, la propia clase MathService requiere algn servicio, la Unidad

    seguir para resolver de forma recursiva todos los servicios dependientes hasta que las

    ha cumplido.

    Qu sigue?La siguiente rea de ubicacin de servicio en MVC 3 que vamos a cubrir esVerMotores y Ver pginas.

    UnityMvcServiceLocator.cs?

    12345

    678910111213141516171819

    using System;using System.Collections.Generic;using System.Web.Mvc;using Microsoft.Practices.Unity;

    public class UnityMvcServiceLocator : IMvcServiceLocator {IUnityContainer _container;

    public UnityMvcServiceLocator(IUnityContainer container) {_container = container;

    }

    public IEnumerable GetAllInstances() {return _container.ResolveAll();

    }

    public IEnumerable GetAllInstances(Type serviceType) {return _container.ResolveAll(serviceType);

    }

    http://bradwilson.typepad.com/blog/2010/07/service-location-pt2-controllers.htmlhttp://bradwilson.typepad.com/blog/2010/07/service-location-pt2-controllers.htmlhttp://bradwilson.typepad.com/blog/2010/07/service-location-pt3-views.htmlhttp://bradwilson.typepad.com/blog/2010/07/service-location-pt3-views.htmlhttp://bradwilson.typepad.com/blog/2010/07/service-location-pt3-views.htmlhttp://bradwilson.typepad.com/blog/2010/07/service-location-pt3-views.htmlhttp://bradwilson.typepad.com/blog/2010/07/service-location-pt2-controllers.htmlhttp://bradwilson.typepad.com/blog/2010/07/service-location-pt2-controllers.htmlhttp://bradwilson.typepad.com/blog/2010/07/service-location-pt2-controllers.htmlhttp://bradwilson.typepad.com/blog/2010/07/service-location-pt3-views.htmlhttp://bradwilson.typepad.com/blog/2010/07/service-location-pt3-views.htmlhttp://bradwilson.typepad.com/blog/2010/07/service-location-pt2-controllers.html
  • 7/22/2019 ASP NET MVC 3 Ubicacin Servicio

    13/33

    10

    2021222324252627282930313233343536

    373839404142434445464748

    4950515253

    public TService GetInstance() {return (TService)Resolve(typeof(TService));

    }

    public TService GetInstance(string key) {return (TService)Resolve(typeof(TService), key);

    }

    public object GetInstance(Type serviceType) {return Resolve(serviceType);

    }

    public object GetInstance(Type serviceType, string key) {return Resolve(serviceType, key);

    }

    public object GetService(Type serviceType) {return Resolve(serviceType);}

    public void Release(object instance) {_container.Teardown(instance);

    }

    private object Resolve(Type serviceType, string key = null) {try {

    return _container.Resolve(serviceType, key);}

    catch (Exception ex) {throw new ActivationException(ex.Message, ex);

    }}

    }

    ASP.NET MVC 3 Ubicacin Servicio, Parte 3: Ver Motores / Ver pginasIndex Series Parte 1: Introduccin Parte 2: Controladores Parte 3: Ver Motores y Ver pginas Parte 4: Filtros Parte 5: IDependencyResolver Parte 6: Validacin del Modelo Parte 7: Modelo de Metadatos Proveedores de Valor: Parte 8 Carpetas Modelo: Parte 9 Parte 10: Controlador Activador Parte 11: Ver Pgina Activador

    Actualizacin importanteHemos hecho cambios signi f icativos en el apoyo de la COI en ASP.NET MVC 3

    Beta. Por favor, leala Parte 5para ms informacin.

    Registro de vista motor y Ver Pgina Creacin

    http://bradwilson.typepad.com/blog/2010/07/service-location-pt1-introduction.htmlhttp://bradwilson.typepad.com/blog/2010/07/service-location-pt1-introduction.htmlhttp://bradwilson.typepad.com/blog/2010/07/service-location-pt2-controllers.htmlhttp://bradwilson.typepad.com/blog/2010/07/service-location-pt2-controllers.htmlhttp://bradwilson.typepad.com/blog/2010/07/service-location-pt4-filters.htmlhttp://bradwilson.typepad.com/blog/2010/07/service-location-pt4-filters.htmlhttp://bradwilson.typepad.com/blog/2010/10/service-location-pt5-idependencyresolver.htmlhttp://bradwilson.typepad.com/blog/2010/10/service-location-pt5-idependencyresolver.htmlhttp://bradwilson.typepad.com/blog/2010/10/service-location-pt6-model-validation.htmlhttp://bradwilson.typepad.com/blog/2010/10/service-location-pt6-model-validation.htmlhttp://bradwilson.typepad.com/blog/2010/10/service-location-pt7-model-metadata.htmlhttp://bradwilson.typepad.com/blog/2010/10/service-location-pt7-model-metadata.htmlhttp://bradwilson.typepad.com/blog/2010/10/service-location-pt8-value-providers.htmlhttp://bradwilson.typepad.com/blog/2010/10/service-location-pt8-value-providers.htmlhttp://bradwilson.typepad.com/blog/2010/10/service-location-pt9-model-binders.htmlhttp://bradwilson.typepad.com/blog/2010/10/service-location-pt9-model-binders.htmlhttp://bradwilson.typepad.com/blog/2010/10/service-location-pt10-controller-activator.htmlhttp://bradwilson.typepad.com/blog/2010/10/service-location-pt10-controller-activator.htmlhttp://bradwilson.typepad.com/blog/2010/10/service-location-pt11-view-page-activator.htmlhttp://bradwilson.typepad.com/blog/2010/10/service-location-pt11-view-page-activator.htmlhttp://bradwilson.typepad.com/blog/2010/10/service-location-pt5-idependencyresolver.htmlhttp://bradwilson.typepad.com/blog/2010/10/service-location-pt5-idependencyresolver.htmlhttp://bradwilson.typepad.com/blog/2010/10/service-location-pt5-idependencyresolver.htmlhttp://bradwilson.typepad.com/blog/2010/10/service-location-pt5-idependencyresolver.htmlhttp://bradwilson.typepad.com/blog/2010/10/service-location-pt11-view-page-activator.htmlhttp://bradwilson.typepad.com/blog/2010/10/service-location-pt10-controller-activator.htmlhttp://bradwilson.typepad.com/blog/2010/10/service-location-pt9-model-binders.htmlhttp://bradwilson.typepad.com/blog/2010/10/service-location-pt8-value-providers.htmlhttp://bradwilson.typepad.com/blog/2010/10/service-location-pt7-model-metadata.htmlhttp://bradwilson.typepad.com/blog/2010/10/service-location-pt6-model-validation.htmlhttp://bradwilson.typepad.com/blog/2010/10/service-location-pt5-idependencyresolver.htmlhttp://bradwilson.typepad.com/blog/2010/07/service-location-pt4-filters.htmlhttp://bradwilson.typepad.com/blog/2010/07/service-location-pt2-controllers.htmlhttp://bradwilson.typepad.com/blog/2010/07/service-location-pt1-introduction.html
  • 7/22/2019 ASP NET MVC 3 Ubicacin Servicio

    14/33

    11

    ASP.NET MVC 1.0 introdujo Ver Engines (ejecucinIViewEngineyIView), envo

    con el nico motor de la vista WebForms basado. Vistas, pginas maestras y vistas

    parciales en WebForms ven necesidad motor derivar

    deViewPage,ViewMasterPageyViewUserControl(respectivamente). En MVC 3,

    hemos introducido nuevos puntos de inyeccin de dependencia de todas estas clases(adems de la nueva clase base para las vistas Razor, WebViewPage).

    ACTUALI ZACIN:(31 de julio de 2010) he aadido el cdigo fuente de

    UnityMvcServiceLocator alfinal de la parte 2.

    RenunciaEste blog habla de ASP.NET MVC 3 Preview 1, que es una versin preliminar.Detalles

    tcnicos especficos pueden cambiar antes del lanzamiento final de MVC 3.Esta versin

    est diseada para obtener retroalimentacin sobre las caractersticas con el tiempo

    suficiente para hacer cambios significativos antes de MVC 3 naves, as que por favor

    comentar sobre esta entrada del blog, opngase en contacto conmigosi usted tiene

    comentarios.

    Ubicacin: View MotoresSe trata de una "multiplicacin registrada" servicio de estilo introducido en MVC

    1.0. Un motor de la vista se ha registrado en elViewEngines.Enginescoleccin

    esttica. El orden es importante con motores de vista, ya que la fachada coleccin se

    pida a cada motor de vista con el fin de representar la vista, el primero que dice que

    puede hacer que se va a ganar.

    Con MVC 3, hemos actualizado lasViewEngineCollectionmtodos fachada(FindViewyFindPartialView) para buscar tanto en los motores estticos vista

    registrados, as como los motores de vista que encuentra en el localizador de

    servicios. Para encontrar a los motores de vista, llama

    MvcServiceLocator.Current.GetAllInstance ().

    El siguiente es un ejemplo de registro de un motor de vista, utilizandoMicrosoft

    Unidadcomo el contenedor de inyeccin de dependencia:

    MyViewEngine.cs?

    12345

    public class MyViewEngine : IViewEngine {

    // ... implementation of IViewEngine ...

    }

    Global.asax.cs?1234

    567

    protected void Application_Start() {// ...

    var container = new UnityContainer();

    container.RegisterType("MyViewEngine");MvcServiceLocator.SetCurrent(new UnityMvcServiceLocator(container));

    http://msdn.microsoft.com/en-us/library/system.web.mvc.iviewengine.aspxhttp://msdn.microsoft.com/en-us/library/system.web.mvc.iviewengine.aspxhttp://msdn.microsoft.com/en-us/library/system.web.mvc.iviewengine.aspxhttp://msdn.microsoft.com/en-us/library/system.web.mvc.iview.aspxhttp://msdn.microsoft.com/en-us/library/system.web.mvc.iview.aspxhttp://msdn.microsoft.com/en-us/library/system.web.mvc.iview.aspxhttp://msdn.microsoft.com/en-us/library/system.web.mvc.viewpage.aspxhttp://msdn.microsoft.com/en-us/library/system.web.mvc.viewpage.aspxhttp://msdn.microsoft.com/en-us/library/system.web.mvc.viewpage.aspxhttp://msdn.microsoft.com/en-us/library/system.web.mvc.viewmasterpage.aspxhttp://msdn.microsoft.com/en-us/library/system.web.mvc.viewmasterpage.aspxhttp://msdn.microsoft.com/en-us/library/system.web.mvc.viewmasterpage.aspxhttp://msdn.microsoft.com/en-us/library/system.web.mvc.viewusercontrol.aspxhttp://msdn.microsoft.com/en-us/library/system.web.mvc.viewusercontrol.aspxhttp://msdn.microsoft.com/en-us/library/system.web.mvc.viewusercontrol.aspxhttp://bradwilson.typepad.com/blog/2010/07/service-location-pt2-controllers.html#unityservicelocatorhttp://bradwilson.typepad.com/blog/2010/07/service-location-pt2-controllers.html#unityservicelocatorhttp://bradwilson.typepad.com/blog/2010/07/service-location-pt2-controllers.html#unityservicelocatorhttp://bradwilson.typepad.com/about.htmlhttp://bradwilson.typepad.com/about.htmlhttp://bradwilson.typepad.com/about.htmlhttp://msdn.microsoft.com/en-us/library/system.web.mvc.viewengines.engines.aspxhttp://msdn.microsoft.com/en-us/library/system.web.mvc.viewengines.engines.aspxhttp://msdn.microsoft.com/en-us/library/system.web.mvc.viewengines.engines.aspxhttp://msdn.microsoft.com/en-us/library/system.web.mvc.viewenginecollection.aspxhttp://msdn.microsoft.com/en-us/library/system.web.mvc.viewenginecollection.aspxhttp://msdn.microsoft.com/en-us/library/system.web.mvc.viewenginecollection.aspxhttp://msdn.microsoft.com/en-us/library/system.web.mvc.viewenginecollection.findview.aspxhttp://msdn.microsoft.com/en-us/library/system.web.mvc.viewenginecollection.findview.aspxhttp://msdn.microsoft.com/en-us/library/system.web.mvc.viewenginecollection.findview.aspxhttp://msdn.microsoft.com/en-us/library/system.web.mvc.viewenginecollection.findpartialview.aspxhttp://msdn.microsoft.com/en-us/library/system.web.mvc.viewenginecollection.findpartialview.aspxhttp://msdn.microsoft.com/en-us/library/system.web.mvc.viewenginecollection.findpartialview.aspxhttp://unity.codeplex.com/http://unity.codeplex.com/http://unity.codeplex.com/http://unity.codeplex.com/http://bradwilson.typepad.com/blog/2010/07/service-location-pt3-views.htmlhttp://bradwilson.typepad.com/blog/2010/07/service-location-pt3-views.htmlhttp://bradwilson.typepad.com/blog/2010/07/service-location-pt3-views.htmlhttp://bradwilson.typepad.com/blog/2010/07/service-location-pt3-views.htmlhttp://bradwilson.typepad.com/blog/2010/07/service-location-pt3-views.htmlhttp://bradwilson.typepad.com/blog/2010/07/service-location-pt3-views.htmlhttp://unity.codeplex.com/http://unity.codeplex.com/http://msdn.microsoft.com/en-us/library/system.web.mvc.viewenginecollection.findpartialview.aspxhttp://msdn.microsoft.com/en-us/library/system.web.mvc.viewenginecollection.findview.aspxhttp://msdn.microsoft.com/en-us/library/system.web.mvc.viewenginecollection.aspxhttp://msdn.microsoft.com/en-us/library/system.web.mvc.viewengines.engines.aspxhttp://bradwilson.typepad.com/about.htmlhttp://bradwilson.typepad.com/blog/2010/07/service-location-pt2-controllers.html#unityservicelocatorhttp://msdn.microsoft.com/en-us/library/system.web.mvc.viewusercontrol.aspxhttp://msdn.microsoft.com/en-us/library/system.web.mvc.viewmasterpage.aspxhttp://msdn.microsoft.com/en-us/library/system.web.mvc.viewpage.aspxhttp://msdn.microsoft.com/en-us/library/system.web.mvc.iview.aspxhttp://msdn.microsoft.com/en-us/library/system.web.mvc.iviewengine.aspx
  • 7/22/2019 ASP NET MVC 3 Ubicacin Servicio

    15/33

    12

    89

    // ...}

    Ahora, cuando el sistema resuelve Vistas por FindView llamada y FindPartialView,

    usar su motor de vista. Cualquier motores de vista el sistema encuentra en el

    localizador de servicios vendrn antes de que los motores de vista registrados con la

    funcin de registro esttico. Si el contenedor admite el orden explcita, los motores de

    vista se utilizarn en el orden devuelto por el localizador de servicios.

    Ubicacin: Ver pginasVer motores son los responsables de la prestacin de sus puntos de vista. En el caso de

    los WebForms y motores de vista Razor, esto toma la forma de clases que se generan

    automticamente desde el origen de la vista (por ejemplo, un archivo aspx. O un archivo

    cshtml.). Estas clases implcitas clases base heredar que el motor de vista es dependiente

    (ViewPage, ViewMasterPage, ViewUserControl o WebViewPage).

    Histricamente, estas clases no han tenido acceso a la dependencia de la funcionalidadde localizacin de la inyeccin / servicio, debido a que su creacin fue enterrado

    profundamente dentro de la implementacin del motor de la vista. En MVC 3, hemos

    actualizado la incorporada en motores de vista para tratar de crear las clases de vista de

    las pginas a travs del localizador de servicios, y si eso falla, se caer de nuevo a usar

    Activator.CreateInstance, al igual que en las versiones anteriores de MVC.

    Una vez ms el uso de la Unidad como nuestro ejemplo contenedor, vamos a suponer

    que tenemos el siguiente cdigo:

    InjectedViewPage.cs?1234567

    using System.Web.Mvc;using Microsoft.Practices.Unity;

    public abstract class InjectedWebViewPage : WebViewPage {[Dependency]public IMathService MathService { get; set; }

    }

    InjectedView.cshtml?1

    23456

    @inherits InjectedWebViewPage

    @{LayoutPage = "../Shared/_Layout.cshtml";View.Title = "Home Page";

    }

    The page says 4 + 8 is @MathService.Add(4, 8).

    Esto nos da una pgina de vista de que tiene acceso a un servicio que se inyecta de

    forma dinmica en la clase base de la pgina de vista.

    Tenga en cuenta que estamos usando la propiedad inyeccin setter aqu en vez de la

    inyeccin de constructor, como ya haba demostrado en nuestras muestras anteriores. La

    razn es uno bastante tcnico que tiene que ver con la forma en que el sistema de

    compilacin de pginas ASP.NET funciona cuando es la conversin de su margen debeneficio en una clase. Si eres curioso acerca de los detalles especficos, por

    http://bradwilson.typepad.com/blog/2010/07/service-location-pt3-views.htmlhttp://bradwilson.typepad.com/blog/2010/07/service-location-pt3-views.htmlhttp://bradwilson.typepad.com/blog/2010/07/service-location-pt3-views.htmlhttp://bradwilson.typepad.com/blog/2010/07/service-location-pt3-views.htmlhttp://bradwilson.typepad.com/blog/2010/07/service-location-pt3-views.htmlhttp://bradwilson.typepad.com/blog/2010/07/service-location-pt3-views.html
  • 7/22/2019 ASP NET MVC 3 Ubicacin Servicio

    16/33

    13

    favorpngase en contacto conmigo. La leccin importante es que el apoyo a la

    inyeccin de dependencia aqu significa utilizar alguna forma otrade inyeccin de

    constructor. Nuestro ejemplo utiliza el atributo de la Unidad [de dependencia] para

    obtener la inyeccin de setter de propiedad, el tipo especfico de la inyeccin y cmo

    lograrlo depender de que el localizador de servicios que est utilizando.ASP.NET MVC 3 Ubicacin Servicio, Parte 4: FiltrosIndex Series Parte 1: Introduccin Parte 2: Controladores Parte 3: Ver Motores y Ver pginas Parte 4: Filtros Parte 5: IDependencyResolver Parte 6: Validacin del Modelo Parte 7: Modelo de Metadatos Proveedores de Valor: Parte 8 Carpetas Modelo: Parte 9 Parte 10: Controlador Activador Parte 11: Ver Pgina Activador

    Actualizacin importanteHemos hecho cambios signi f icativos en el apoyo de la COI en ASP.NET MVC 3

    Beta. Por favor, leala Parte 5para ms informacin.

    Filtros y filtro ProveedoresHemos introducido el concepto de filtros en ASP.NET MVC 1.0. Un filtro puede poner

    en prctica una o ms de las siguientes

    interfaces:IActionFilter,IResultFilter,IExceptionFilteryIAuthorizationFilter.

    En versiones anteriores de MVC, la nica manera de aplicar filtros era hacer un atributo

    de filtro y aplicar ese atributo a un controlador o un mtodo de accin. En MVC 3,

    hemos introducido la posibilidad de tener filtros que se definen fuera del alcance de los

    atributos (y encontrado a travs de los proveedores de filtro), as como una facilidad

    para el registro de los filtros globales.

    ACTUALI ZACIN:(31 de julio de 2010) he aadido el cdigo fuente de

    UnityMvcServiceLocator alfinal de la parte 2.

    RenunciaEste blog habla de ASP.NET MVC 3 Preview 1, que es una versin preliminar.Detalles

    tcnicos especficos pueden cambiar antes del lanzamiento final de MVC 3.Esta versin

    est diseada para obtener retroalimentacin sobre las caractersticas con el tiempo

    suficiente para hacer cambios significativos antes de MVC 3 naves, as que por favor

    comentar sobre esta entrada del blog, opngase en contacto conmigosi usted tiene

    comentarios.

    Ubicacin: Filtrar ProveedoresProveedores de filtros son una nueva caracterstica a MVC 3. Se trata de una"multiplicacin registrada" servicio de estilo, con un punto de registro esttico a

    http://bradwilson.typepad.com/about.htmlhttp://bradwilson.typepad.com/about.htmlhttp://bradwilson.typepad.com/about.htmlhttp://bradwilson.typepad.com/blog/2010/07/service-location-pt1-introduction.htmlhttp://bradwilson.typepad.com/blog/2010/07/service-location-pt1-introduction.htmlhttp://bradwilson.typepad.com/blog/2010/07/service-location-pt2-controllers.htmlhttp://bradwilson.typepad.com/blog/2010/07/service-location-pt2-controllers.htmlhttp://bradwilson.typepad.com/blog/2010/07/service-location-pt3-views.htmlhttp://bradwilson.typepad.com/blog/2010/07/service-location-pt3-views.htmlhttp://bradwilson.typepad.com/blog/2010/10/service-location-pt5-idependencyresolver.htmlhttp://bradwilson.typepad.com/blog/2010/10/service-location-pt5-idependencyresolver.htmlhttp://bradwilson.typepad.com/blog/2010/10/service-location-pt6-model-validation.htmlhttp://bradwilson.typepad.com/blog/2010/10/service-location-pt6-model-validation.htmlhttp://bradwilson.typepad.com/blog/2010/10/service-location-pt7-model-metadata.htmlhttp://bradwilson.typepad.com/blog/2010/10/service-location-pt7-model-metadata.htmlhttp://bradwilson.typepad.com/blog/2010/10/service-location-pt8-value-providers.htmlhttp://bradwilson.typepad.com/blog/2010/10/service-location-pt8-value-providers.htmlhttp://bradwilson.typepad.com/blog/2010/10/service-location-pt9-model-binders.htmlhttp://bradwilson.typepad.com/blog/2010/10/service-location-pt9-model-binders.htmlhttp://bradwilson.typepad.com/blog/2010/10/service-location-pt10-controller-activator.htmlhttp://bradwilson.typepad.com/blog/2010/10/service-location-pt10-controller-activator.htmlhttp://bradwilson.typepad.com/blog/2010/10/service-location-pt11-view-page-activator.htmlhttp://bradwilson.typepad.com/blog/2010/10/service-location-pt11-view-page-activator.htmlhttp://bradwilson.typepad.com/blog/2010/10/service-location-pt5-idependencyresolver.htmlhttp://bradwilson.typepad.com/blog/2010/10/service-location-pt5-idependencyresolver.htmlhttp://bradwilson.typepad.com/blog/2010/10/service-location-pt5-idependencyresolver.htmlhttp://msdn.microsoft.com/en-us/library/system.web.mvc.iactionfilter.aspxhttp://msdn.microsoft.com/en-us/library/system.web.mvc.iactionfilter.aspxhttp://msdn.microsoft.com/en-us/library/system.web.mvc.iactionfilter.aspxhttp://msdn.microsoft.com/en-us/library/system.web.mvc.iresultfilter.aspxhttp://msdn.microsoft.com/en-us/library/system.web.mvc.iresultfilter.aspxhttp://msdn.microsoft.com/en-us/library/system.web.mvc.iresultfilter.aspxhttp://msdn.microsoft.com/en-us/library/system.web.mvc.iexceptionfilter.aspxhttp://msdn.microsoft.com/en-us/library/system.web.mvc.iexceptionfilter.aspxhttp://msdn.microsoft.com/en-us/library/system.web.mvc.iexceptionfilter.aspxhttp://msdn.microsoft.com/en-us/library/system.web.mvc.iauthorizationfilter.aspxhttp://msdn.microsoft.com/en-us/library/system.web.mvc.iauthorizationfilter.aspxhttp://msdn.microsoft.com/en-us/library/system.web.mvc.iauthorizationfilter.aspxhttp://bradwilson.typepad.com/blog/2010/07/service-location-pt2-controllers.html#unityservicelocatorhttp://bradwilson.typepad.com/blog/2010/07/service-location-pt2-controllers.html#unityservicelocatorhttp://bradwilson.typepad.com/blog/2010/07/service-location-pt2-controllers.html#unityservicelocatorhttp://bradwilson.typepad.com/about.htmlhttp://bradwilson.typepad.com/about.htmlhttp://bradwilson.typepad.com/about.htmlhttp://bradwilson.typepad.com/about.htmlhttp://bradwilson.typepad.com/blog/2010/07/service-location-pt2-controllers.html#unityservicelocatorhttp://msdn.microsoft.com/en-us/library/system.web.mvc.iauthorizationfilter.aspxhttp://msdn.microsoft.com/en-us/library/system.web.mvc.iexceptionfilter.aspxhttp://msdn.microsoft.com/en-us/library/system.web.mvc.iresultfilter.aspxhttp://msdn.microsoft.com/en-us/library/system.web.mvc.iactionfilter.aspxhttp://bradwilson.typepad.com/blog/2010/10/service-location-pt5-idependencyresolver.htmlhttp://bradwilson.typepad.com/blog/2010/10/service-location-pt11-view-page-activator.htmlhttp://bradwilson.typepad.com/blog/2010/10/service-location-pt10-controller-activator.htmlhttp://bradwilson.typepad.com/blog/2010/10/service-location-pt9-model-binders.htmlhttp://bradwilson.typepad.com/blog/2010/10/service-location-pt8-value-providers.htmlhttp://bradwilson.typepad.com/blog/2010/10/service-location-pt7-model-metadata.htmlhttp://bradwilson.typepad.com/blog/2010/10/service-location-pt6-model-validation.htmlhttp://bradwilson.typepad.com/blog/2010/10/service-location-pt5-idependencyresolver.htmlhttp://bradwilson.typepad.com/blog/2010/07/service-location-pt3-views.htmlhttp://bradwilson.typepad.com/blog/2010/07/service-location-pt2-controllers.htmlhttp://bradwilson.typepad.com/blog/2010/07/service-location-pt1-introduction.htmlhttp://bradwilson.typepad.com/about.html
  • 7/22/2019 ASP NET MVC 3 Ubicacin Servicio

    17/33

    14

    FilterProviders.Providers. Esta coleccin ofrece un mtodo fachada (GetFilters) que

    agrega los filtros de todos los proveedores en una sola lista. Orden de los proveedores

    no es importante.

    Por defecto, hay tres proveedores de filtros registrados en la aplicacin: Un proveedor de filtro para los filtros globales (GlobalFilters.Filters) Un proveedor de filtros para los atributos de filtro (FilterAttributeFilterProvider) Un proveedor de filtros para las instancias del controlador

    (ControllerInstanceFilterProvider)

    Adems, el mtodo GetFilters fachada tambin recuperar todos los casos IFilterProvider

    en el localizador de servicio llamando MvcServiceLocator.Current.GetAllInstances

    ().

    Implementar un proveedor de FiltroLa interfaz de proveedor de filtro se define como sigue:?

    12345678

    namespaceSystem.Web.Mvc {usingSystem.Collections.Generic;

    publicinterfaceIFilterProvider {IEnumerable GetFilters(ControllerContext controllerContext,

    ActionDescriptor actionDescriptor); }

    }

    La clase de filtro es una clase de metadatos que contiene una referencia a la aplicacin

    de una o ms de las interfaces de filtro, adems de fin y el alcance del filtro. La clase se

    define como:?

    12345678910

    11

    namespaceSystem.Web.Mvc {publicclassFilter {

    publicconstintDefaultOrder = -1;

    publicFilter(objectinstance, FilterScope scope, int? order = null);

    publicobject Instance { get; }publicint Order { get; }publicFilterScope Scope { get; }

    }

    }

    Filtro OrdenLos filtros se ejecutan en un orden predeterminado, este comportamiento ha existido en

    las versiones anteriores de MVC, pero ahora hemos aadido un margen adicional

    (global):?

    123456

    namespaceSystem.Web.Mvc {publicenumFilterScope {

    First = 0,Global = 10,Controller = 20,Action = 30,

    http://bradwilson.typepad.com/blog/2010/07/service-location-pt4-filters.htmlhttp://bradwilson.typepad.com/blog/2010/07/service-location-pt4-filters.htmlhttp://bradwilson.typepad.com/blog/2010/07/service-location-pt4-filters.htmlhttp://bradwilson.typepad.com/blog/2010/07/service-location-pt4-filters.htmlhttp://bradwilson.typepad.com/blog/2010/07/service-location-pt4-filters.htmlhttp://bradwilson.typepad.com/blog/2010/07/service-location-pt4-filters.htmlhttp://bradwilson.typepad.com/blog/2010/07/service-location-pt4-filters.htmlhttp://bradwilson.typepad.com/blog/2010/07/service-location-pt4-filters.htmlhttp://bradwilson.typepad.com/blog/2010/07/service-location-pt4-filters.html
  • 7/22/2019 ASP NET MVC 3 Ubicacin Servicio

    18/33

    15

    789

    Last = 100,}

    }

    Cuando se determina el orden de ejecucin de los filtros, se los clasifica por primera vez

    por su orden (nmeros ms bajos primero), luego por su mbito de aplicacin (tambin

    nmeros ms bajos primero). Un ejemplo ordenados: Solicite -100, Scope ltima Orden 0, Scope Primera Orden 0, Alcance Global Orden 0, Controller Scope Orden 0, mbito de Accin Orden 0, Scope ltima Orden 100, Alcance Primera

    Es importante sealar aqu que alcance "Controller" significa "los filtros aplicados a

    nivel del controlador", el controlador de s mismo es tambin un filtro que siempre se

    ejecuta primero (es decir, su fin es Int32.MinValue y alcance es primero). El orden deejecucin de los filtros con el mismo orden y el alcance est definido.

    Cuando el sistema ejecuta los filtros, a veces se ejecutan desde el frente de la lista en la

    parte posterior (hacia adelante), ya veces van de la parte posterior de la lista en la parte

    delantera (hacia atrs). Adems, los filtros se pueden omitir en algunas situaciones.

    IActionFilter.OnActionExecuting se ejecuta con el fin hacia adelante, y

    IActionFilter.OnActionExecuted se ejecuta en el orden inverso. Si su

    OnActionExecuting nunca fue llamado (porque un filtro anterior termina la cadena),

    entonces su OnActionExecuted no se llamar tampoco.

    IResultFilter.OnResultExecuting y OnResultExecuted sigue las mismas reglas comoIActionFilter.

    IAuthorizationFilter.OnAuthorization siempre se ejecuta en orden progresivo, y

    IExceptionFilter.OnError siempre se ejecuta en el orden inverso.

    En versiones anteriores de MVC, IExceptionFilter.OnError corri el fin hacia

    adelante; para MVC 3, hemos invertido el orden de este filtro basado en la

    retroalimentacin de la comunidad. Filtros de excepcin en MVC tienen una sensacin

    similar a los controladores de excepciones en. NET, que descanse de adentro hacia

    afuera. Mientras que esta inversin es tcnicamente un cambio importante, estamos

    seguros de que ahora se comporta con una mayor previsibilidad.

    La implementacin de un filtroUn filtro es una clase que implementa una o ms de las interfaces de filtro mencionados

    anteriormente. Para los filtros que son atributos, puede utilizar el FilterAttribute o la

    ActionFilterAttribute como clase base. Para los filtros no de atributos, no hay una clase

    base por defecto, basta con implementar las interfaces de filtro, segn corresponda.

    Adems de apoyar una o varias de las interfaces de filtro, tambin puede optar por

    aplicar IMvcFilter:?

    1namespaceSystem.Web.Mvc {

    publicinterfaceIMvcFilter {

    http://bradwilson.typepad.com/blog/2010/07/service-location-pt4-filters.htmlhttp://bradwilson.typepad.com/blog/2010/07/service-location-pt4-filters.htmlhttp://bradwilson.typepad.com/blog/2010/07/service-location-pt4-filters.html
  • 7/22/2019 ASP NET MVC 3 Ubicacin Servicio

    19/33

    16

    23456

    boolAllowMultiple { get; }intOrder { get; }

    }}

    Se trata de una interfaz de metadatos que le permite decir el marco MVC cmo tratar loscasos de este filtro.

    Hemos actualizado la clase base FilterAttribute para implementar esta interfaz de forma

    automtica para usted. La propiedad IMvcFilter.Order refleja el valor de

    FilterAttribute.Order, y la propiedad IMvcFilter.AllowMultiple se deriva

    automticamente en funcin del [AttributeUsage (AllowMultiple =)] atributo de

    propiedad aplicado a su atributo de filtro personalizado.

    Usted probablemente ha notado ms arriba que el constructor del objeto Filtro toma un

    parmetro de orden opcional, que es nulo por defecto. Al pasar null, que est pidiendo a

    la clase de filtro para buscar la implementacin de IMvcFilter en el propio objeto defiltro para determinar su orden.

    La propiedad AllowMultiple de IMvcFilter se utiliza durante la clasificacin con el fin

    de eliminar filtros duplicados. Cuando AllowMultiple es cierto, eso significa que todas

    las instancias del mismo tipo de filtro exactase les permite, cuando AllowMultiple es

    falso, lo que significa que slo la ltimainstancia del mismo tipo de filtro exactaest

    permitido, y todos los dems se descartan. Si el filtro no implementa IMvcFilter,

    entonces el valor por defecto para AllowMultiple es cierto.

    Anteriormente, todos estos detalles de implementacin se ocultan dentro de las clases de

    descriptor de accin y clases de atributos del filtro.Registro de un filtro globalUn filtro global es un filtro que se va a ejecutar para cada accin en cada controlador

    individual. Puede registrar un filtro global mediante el uso de la variable de registro

    esttico GlobalFilters.Filter. Cuando se especifica una instancia de filtro aqu, usted no

    puede proporcionar el alcance, ya que se ajusta automticamente a Global para usted:?

    12

    345678

    publicsealedclassGlobalFilterCollection : IEnumerable, IFilterProvider {publicintCount { get; }

    publicvoidAdd(objectfilter, int? order = null);publicvoidClear();publicboolContains(objectfilter);publicvoidRemove(objectfilter);

    }

    Aunque se agregan instancias de filtro como objetos a la coleccin, en realidad devuelve

    una instancia de la clase de metadatos Filtro al enumerar el contenedor.

    En este momento, no hay manera de registrar un filtro global con el localizador de

    servicios.

    Adicin de Inyeccin de Dependencia a Filtros

    http://bradwilson.typepad.com/blog/2010/07/service-location-pt4-filters.htmlhttp://bradwilson.typepad.com/blog/2010/07/service-location-pt4-filters.htmlhttp://bradwilson.typepad.com/blog/2010/07/service-location-pt4-filters.html
  • 7/22/2019 ASP NET MVC 3 Ubicacin Servicio

    20/33

    17

    Un proveedor de filtro es responsable de devolver las instancias de los objetos de filtro

    en el marco MVC, por lo que es responsable de asegurar que la inyeccin de

    dependencia se observa correctamente, siempre que sea posible.

    Un lugar donde la inyeccin de dependencia ha sido difcil en el pasado es el interior del

    filtro atribuye a s mismos. Debido a que el. NET marco es realmente responsable de lacreacin de estas instancias de atributo, no podemos usar una estrategia tradicional de

    inyeccin de dependencias.

    El contenedor de la unidad es capaz de proporcionar la inyeccin no constructor de

    instancias de objetos existentes. Aqu es un proveedor de filtro de ejemplo que anula el

    comportamiento predeterminado del FilterAttributeFilterProvider para permitir la

    inyeccin de setter de propiedad sobre los atributos de filtro:

    UnityFilterAttributeFilterProvider.cs?

    123456789101112

    131415161718192021222324

    25262728293031323334353637

    usingSystem.Collections.Generic; usingSystem.Web.Mvc;usingMicrosoft.Practices.Unity;

    publicclassUnityFilterAttributeFilterProvider : FilterAttributeFilterProvider {privateIUnityContainer _container;

    publicUnityFilterAttributeFilterProvider(IUnityContainer container) {_container = container;

    }

    protectedoverrideIEnumerable GetControllerAttributes(ControllerContext controllerContext,ActionDescriptor actionDescriptor) {

    varattributes = base.GetControllerAttributes(controllerContext,actionDescriptor);

    foreach(varattribute inattributes) {_container.BuildUp(attribute.GetType(), attribute);

    }

    returnattributes;}

    protectedoverrideIEnumerable GetActionAttributes(ControllerContext controllerContext,ActionDescriptor actionDescriptor) {

    varattributes = base.GetActionAttributes(controllerContext,actionDescriptor);

    foreach(varattribute inattributes) {_container.BuildUp(attribute.GetType(), attribute);

    }

    returnattributes;}

    }

    http://bradwilson.typepad.com/blog/2010/07/service-location-pt4-filters.htmlhttp://bradwilson.typepad.com/blog/2010/07/service-location-pt4-filters.htmlhttp://bradwilson.typepad.com/blog/2010/07/service-location-pt4-filters.html
  • 7/22/2019 ASP NET MVC 3 Ubicacin Servicio

    21/33

    18

    Global.asax.cs?

    123

    4567891011121314

    protectedvoidApplication_Start() {// ...

    varoldProvider = FilterProviders.Providers.Single(f => f isFilterAttributeFilterProvider

    );FilterProviders.Providers.Remove(oldProvider);

    varcontainer = newUnityContainer();varprovider = newUnityFilterAttributeFilterProvider(container); FilterProviders.Providers.Add(provider);

    // ...}

    Este cdigo elimina la aplicacin antigua FilterAttributeFilterProvider y lo reemplaza

    con el que puede utilizar la unidad para hacer la inyeccin de setter de propiedad sobre

    los atributos de filtro, de modo que usted puede escribir atributos como esto:

    InjectedFilterAttribute.cs?

    123456

    78910111213141516

    usingSystem;usingSystem.Web.Mvc;usingMicrosoft.Practices.Unity;

    publicclassInjectedFilterAttribute : ActionFilterAttribute {

    [Dependency]publicIMathService MathService { get; set; }

    publicoverridevoidOnResultExecuted(ResultExecutedContext filterContext) {filterContext.HttpContext.Response.Write(

    String.Format("

    The filter says 2 + 3 is {0}.

    ",MathService.Add(2, 3))

    );}

    }

    Por supuesto, tambin puede registrar el nuevo proveedor de filtro en el localizador de

    servicios, en lugar de utilizar el criterio de valoracin el registro esttico:Global.asax.cs?

    12345678

    910

    protectedvoidApplication_Start() {// ...

    varoldProvider = FilterProviders.Providers.Single(f => f isFilterAttributeFilterProvider

    );FilterProviders.Providers.Remove(oldProvider);

    varcontainer = newUnityContainer();

    varprovider = newUnityFilterAttributeFilterProvider(container); container.RegisterInstance(provider, "attributes");

    http://bradwilson.typepad.com/blog/2010/07/service-location-pt4-filters.htmlhttp://bradwilson.typepad.com/blog/2010/07/service-location-pt4-filters.htmlhttp://bradwilson.typepad.com/blog/2010/07/service-location-pt4-filters.htmlhttp://bradwilson.typepad.com/blog/2010/07/service-location-pt4-filters.htmlhttp://bradwilson.typepad.com/blog/2010/07/service-location-pt4-filters.htmlhttp://bradwilson.typepad.com/blog/2010/07/service-location-pt4-filters.htmlhttp://bradwilson.typepad.com/blog/2010/07/service-location-pt4-filters.htmlhttp://bradwilson.typepad.com/blog/2010/07/service-location-pt4-filters.htmlhttp://bradwilson.typepad.com/blog/2010/07/service-location-pt4-filters.html
  • 7/22/2019 ASP NET MVC 3 Ubicacin Servicio

    22/33

    19

    1112131415

    MvcServiceLocator.SetCurrent(new UnityMvcServiceLocator(container));

    // ...}

    ASP.NET MVC 3 Ubicacin Servicio, Parte 5: IDependencyResolver

    Index Series Parte 1: Introduccin Parte 2: Controladores Parte 3: Ver Motores y Ver pginas Parte 4: Filtros Parte 5: IDependencyResolver Parte 6: Validacin del Modelo Parte 7: Modelo de Metadatos Proveedores de Valor: Parte 8 Carpetas Modelo: Parte 9 Parte 10: Controlador Activador Parte 11: Ver Pgina Activador

    Novedades Desde Preview 1?EnviamosMVC 3 Beta ASP.NETde hoy, y con l hemos hecho algunos progresos

    significativos (y salidas) de la MVC 3 Preview 1 build publicado en julio en lo que

    respecta a la ubicacin del servicio.

    Recibimos retroalimentacin importante durante el perodo de tiempo Preview 1 sobre

    el uso que se propone el uso delServicio de Busqueda comn. La opinin mayoritaria

    fue que MVC debe permitir localizadores Servicio Comn para la integracin con

    MVC, pero la dependencia estricta de que no era necesario (o incluso deseable, ya que

    aade una dependencia binaria extra para la redistribucin y el despliegue).

    Hemos introducido una nueva interfaz: System.Web.Mvc.IDependencyResolver. Esta

    interfaz tiene por objeto simplificar los requisitos para la resolucin local de servicio /

    dependencia con MVC.

    RenunciaEste blog habla de MVC 3 Beta ASP.NET, que es una versin preliminar. Detalles

    tcnicos especficos pueden cambiar antes del lanzamiento final de MVC 3. Esta

    versin est diseada para obtener retroalimentacin sobre las caractersticas con eltiempo suficiente para hacer cambios significativos antes de MVC 3 naves, as que por

    favor comentar sobre esta entrada del blog, opngase en contacto conmigosi usted

    tiene comentarios.

    IDependencyResolverPara los desarrolladores portar cdigo de MVC 3 Preview 1 a MVC 3 Beta, esta

    interfaz reemplaza IMvcServiceLocator.

    Para implementar un solucionador de dependencias para MVC, tendr que implementar

    esta interfaz:?1 publicinterfaceIDependencyResolver {

    http://bradwilson.typepad.com/blog/2010/07/service-location-pt1-introduction.htmlhttp://bradwilson.typepad.com/blog/2010/07/service-location-pt1-introduction.htmlhttp://bradwilson.typepad.com/blog/2010/07/service-location-pt2-controllers.htmlhttp://bradwilson.typepad.com/blog/2010/07/service-location-pt2-controllers.htmlhttp://bradwilson.typepad.com/blog/2010/07/service-location-pt3-views.htmlhttp://bradwilson.typepad.com/blog/2010/07/service-location-pt3-views.htmlhttp://bradwilson.typepad.com/blog/2010/07/service-location-pt4-filters.htmlhttp://bradwilson.typepad.com/blog/2010/07/service-location-pt4-filters.htmlhttp://bradwilson.typepad.com/blog/2010/10/service-location-pt6-model-validation.htmlhttp://bradwilson.typepad.com/blog/2010/10/service-location-pt6-model-validation.htmlhttp://bradwilson.typepad.com/blog/2010/10/service-location-pt7-model-metadata.htmlhttp://bradwilson.typepad.com/blog/2010/10/service-location-pt7-model-metadata.htmlhttp://bradwilson.typepad.com/blog/2010/10/service-location-pt8-value-providers.htmlhttp://bradwilson.typepad.com/blog/2010/10/service-location-pt8-value-providers.htmlhttp://bradwilson.typepad.com/blog/2010/10/service-location-pt9-model-binders.htmlhttp://bradwilson.typepad.com/blog/2010/10/service-location-pt9-model-binders.htmlhttp://bradwilson.typepad.com/blog/2010/10/service-location-pt10-controller-activator.htmlhttp://bradwilson.typepad.com/blog/2010/10/service-location-pt10-controller-activator.htmlhttp://bradwilson.typepad.com/blog/2010/10/service-location-pt11-view-page-activator.htmlhttp://bradwilson.typepad.com/blog/2010/10/service-location-pt11-view-page-activator.htmlhttp://go.microsoft.com/fwlink/?LinkID=191795http://go.microsoft.com/fwlink/?LinkID=191795http://go.microsoft.com/fwlink/?LinkID=191795http://commonservicelocator.codeplex.com/http://commonservicelocator.codeplex.com/http://commonservicelocator.codeplex.com/http://bradwilson.typepad.com/about.htmlhttp://bradwilson.typepad.com/about.htmlhttp://bradwilson.typepad.com/about.htmlhttp://bradwilson.typepad.com/blog/2010/10/service-location-pt5-idependencyresolver.htmlhttp://bradwilson.typepad.com/blog/2010/10/service-location-pt5-idependencyresolver.htmlhttp://bradwilson.typepad.com/blog/2010/10/service-location-pt5-idependencyresolver.htmlhttp://bradwilson.typepad.com/about.htmlhttp://commonservicelocator.codeplex.com/http://go.microsoft.com/fwlink/?LinkID=191795http://bradwilson.typepad.com/blog/2010/10/service-location-pt11-view-page-activator.htmlhttp://bradwilson.typepad.com/blog/2010/10/service-location-pt10-controller-activator.htmlhttp://bradwilson.typepad.com/blog/2010/10/service-location-pt9-model-binders.htmlhttp://bradwilson.typepad.com/blog/2010/10/service-location-pt8-value-providers.htmlhttp://bradwilson.typepad.com/blog/2010/10/service-location-pt7-model-metadata.htmlhttp://bradwilson.typepad.com/blog/2010/10/service-location-pt6-model-validation.htmlhttp://bradwilson.typepad.com/blog/2010/07/service-location-pt4-filters.htmlhttp://bradwilson.typepad.com/blog/2010/07/service-location-pt3-views.htmlhttp://bradwilson.typepad.com/blog/2010/07/service-location-pt2-controllers.htmlhttp://bradwilson.typepad.com/blog/2010/07/service-location-pt1-introduction.html
  • 7/22/2019 ASP NET MVC 3 Ubicacin Servicio

    23/33

    20

    234

    objectGetService(Type serviceType);IEnumerable GetServices(Type serviceType);

    }

    Enla Parte 1de la serie, habl sobre tres maneras en que MVC consume los servicios

    con el localizador de servicios: servicios individualmente registradas, servicios

    registrados, se multiplican y la creacin de objetos arbitrarios.La resolucin de los servicios por separado registradas y creacin de objetos arbitrarios

    llamar IDependencyResolver.GetService (), mientras que la resolucin de los servicios

    se multiplican registrados se puede hacer llamando IDependencyResolver.GetServices

    (). Hemos aadido dos servicios activadoras que proporcionan alternativas para la

    creacin de objetos arbitrarios (vase la Parte 10 para obtener informacin sobre

    elActivador Controller, y en la Parte 11 para obtener informacin sobre laVista Pgina

    Activador).

    Aparte de la simplicidad de la interfaz, la principal salida de Common Servicio de

    localizacin es que los ejecutores de IDependencyResolver siempre deben devolver nullde GetService cuando no se puede encontrar el servicio. Al igual que el CSL,

    IDependencyResolver.GetServices siempre debe devolver una coleccin vaca si no se

    puede encontrar ningn servicio. Si su aplicacin de IDependencyResolver lanza

    ninguna excepcin (o retornos nulos de GetServices en lugar de una coleccin vaca), se

    apareci al usuario como un error en tiempo de ejecucin.

    DependencyResolverPara los desarrolladores portar cdigo de MVC 3 Preview 1 a MVC 3 Beta, esta clase

    reemplaza MvcServiceLocator.Hay un punto de registro para la resolucin de la dependencia: la clase esttica

    DependencyResolver.?

    1

    2

    3

    4

    5

    6

    7

    8

    publicclassDependencyResolver {publicstaticIDependencyResolver Current { get; }

    publicstaticvoidSetResolver(IDependencyResolver resolver);publicstaticvoidSetResolver(objectcommonServiceLocator);publicstaticvoidSetResolver(Func getService,

    Func getServices);

    }

    Hay tres puntos de registro que puede utilizar: uno si tiene una implementacin de

    IDependencyResolver, uno si tiene un implemento de IServiceLocator de Common

    Service Locator, y uno si desea registrar una resolucin ad-hoc basado en funciones con

    la firma correcta.

    La segunda sobrecarga toma un objeto en lugar de IServiceLocator, porque ASP.NET

    MVC 3 no tiene una dependencia fuerte en el CommonServiceLocator. Se utilizar el

    tiempo de ejecucin de reflexin para determinar si el objeto en cuestin es realmente

    una implementacin de IServiceLocator.

    http://bradwilson.typepad.com/blog/2010/07/service-location-pt1-introduction.htmlhttp://bradwilson.typepad.com/blog/2010/07/service-location-pt1-introduction.htmlhttp://bradwilson.typepad.com/blog/2010/07/service-location-pt1-introduction.htmlhttp://bradwilson.typepad.com/blog/2010/10/service-location-pt10-controller-activator.htmlhttp://bradwilson.typepad.com/blog/2010/10/service-location-pt10-controller-activator.htmlhttp://bradwilson.typepad.com/blog/2010/10/service-location-pt10-controller-activator.htmlhttp://bradwilson.typepad.com/blog/2010/10/service-location-pt11-view-page-activator.htmlhttp://bradwilson.typepad.com/blog/2010/10/service-location-pt11-view-page-activator.htmlhttp://bradwilson.typepad.com/blog/2010/10/service-location-pt11-view-page-activator.htmlhttp://bradwilson.typepad.com/blog/2010/10/service-location-pt11-view-page-activator.htmlhttp://bradwilson.typepad.com/blog/2010/10/service-location-pt5-idependencyresolver.htmlhttp://bradwilson.typepad.com/blog/2010/10/service-location-pt5-idependencyresolver.htmlhttp://bradwilson.typepad.com/blog/2010/10/service-location-pt5-idependencyresolver.htmlhttp://bradwilson.typepad.com/blog/2010/10/service-location-pt11-view-page-activator.htmlhttp://bradwilson.typepad.com/blog/2010/10/service-location-pt11-view-page-activator.htmlhttp://bradwilson.typepad.com/blog/2010/10/service-location-pt10-controller-activator.htmlhttp://bradwilson.typepad.com/blog/2010/07/service-location-pt1-introduction.html
  • 7/22/2019 ASP NET MVC 3 Ubicacin Servicio

    24/33

    21

    Independientemente del mtodo de registro se utiliza, volveremos una implementacin

    de IDependencyResolver cuando llame DependencyResolver.Current. Si se ha

    registrado algo ms que una implementacin de IDependencyResolver, envolvemos

    para arriba para usted, por lo que todo el cdigo de reconocimiento de ubicacin de

    servicios slo puede utilizar la interfaz nica.Hay un solucionador de dependencias por defecto que utiliza Activator.CreateInstance,

    que es adecuado para los usuarios que no tienen previsto utilizar la inyeccin de

    dependencias.

    Los mtodos de extensin para IDependencyResolverUsted puede haber notado que no hay versiones genricas de GetService o GetServices

    sobre IDependencyResolver. Proporcionamos mtodos de extensin para

    IDependencyResolver que proporcionan estos mtodos genricos:?

    1234567

    TService GetService(thisIDependencyResolver resolver) {return(TService)resolver.GetService(typeof(TService));

    }

    IEnumerable GetServices(thisIDependencyResolver resolver) {returnresolver.GetServices(typeof(TService)).Cast();

    }

    Mediante el uso de mtodos de extensin, hemos simplificad