2010-04-19 21 views
5

Nuevo en Castle/Windsor, por favor tengan paciencia conmigo.castillo PerRequestLifestyle no reconocido

actualmente estoy usando el marco System.Web.Mvc.Extensibility y en su código de puesta en marcha, se registró HttpContextBase como la siguiente:

container.Register(Component.For<HttpContextBase>().LifeStyle.Transient.UsingFactoryMethod(() => new HttpContextWrapper(HttpContext.Current))); 

Lo que quería hacer es cambiar el comportamiento y cambiar el estilo de vida de HttpContextBase estar PerWebRequest.

por lo que dispone de cambiar el código a la siguiente:

container.Register(Component.For<HttpContextBase>().LifeStyle.PerWebRequest.UsingFactoryMethod(() => new HttpContextWrapper(HttpContext.Current))); 

Sin embargo, cuando hago esto, tengo el siguiente error:

System.Configuration.ConfigurationErrorsException: Looks like you forgot to 
register the http module Castle.MicroKernel.Lifestyle.PerWebRequestLifestyleModule 
Add '<add name="PerRequestLifestyle" 
type="Castle.MicroKernel.Lifestyle.PerWebRequestLifestyleModule, Castle.MicroKernel" 
/>' to the <httpModules> section on your web.config 

que hice bajo <system.web> y <system.webServer>, sin embargo , Sigo recibiendo el mismo error. ¿Algún consejo?

Gracias de antemano.

actualización

añadió bloque de código por solicitud

En el marco system.web.mvc.extensibility, hay una clase llamada extendedMvcApplication que heredan de HttpApplication, y en el método Application_Start, llama BootStrapper.Execute(). Esta implementación de este método es el siguiente:

public void Execute() 
    { 
     bool shouldSkip = false; 

     foreach (IBootstrapperTask task in ServiceLocator.GetAllInstances<IBootstrapperTask>().OrderBy(task => task.Order)) 
     { 
      if (shouldSkip) 
      { 
       shouldSkip = false; 
       continue; 
      } 

      TaskContinuation continuation = task.Execute(ServiceLocator); 

      if (continuation == TaskContinuation.Break) 
      { 
       break; 
      } 

      shouldSkip = continuation == TaskContinuation.Skip; 
     } 
    } 

Como se puede ver, se realiza un bucle a través de una lista de IBootStrapperTask y trata de ejecutarlos. Sucede que tengo una tarea que registra las rutas en mi aplicación MVC:

public class RegisterRoutes : RegisterRoutesBase 
{ 
    private HttpContextBase contextBase; 

    protected override TaskContinuation ExecuteCore(IServiceLocator serviceLocator) 
    { 
     contextBase = serviceLocator.GetInstance<HttpContextBase>(); 
     return base.ExecuteCore(serviceLocator); 
    } 

    protected override void Register(RouteCollection routes) 
    { 
     routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); 
     routes.IgnoreRoute("{*favicon}", new { favicon = @"(.*/)?favicon.ico(/.*)?" }); 
     routes.IgnoreRoute("{*robotstxt}", new { robotstxt = @"(.*/)?robots.txt(/.*)?" }); 

     XmlRouting.SetAppRoutes(routes, contextBase.Server.MapPath("~/Configuration/Routes.xml")); 
    } 
} 

se puede ver que tengo que getInstance (resolver) un objeto HttpContextBase tal que pueda obtener la ruta del servidor de un fichero XML .

+1

¿Cuándo resuelves ese objeto? ¿en cuyo punto? –

+0

en Application_Start(), ¿es demasiado pronto? – Herman

+0

@Herman: no es compatible en este momento. ¿Qué estás tratando de resolver en Application_Start()? –

Respuesta

7

Al escribir estas líneas, PerWebRequest estilo de vida no es compatible con la resolución de Application_Start().

Ver descripción del problema y discusión:

soluciones para este caso en particular:

  1. Registro RegisterRoutes como una instancia, pasando explícitamente la cu contexto actual como parámetro constructor, p.:

    container.Register(Component.For<IBootstrapperTask>() 
              .Instance(new RegisterRoutes(Context))); 
    
  2. Uso HostingEnvironment.MapPath en lugar de contextBase.Server.MapPath. ¿Quieres hacerlo maquetable? Utilizarlo a través de una interfaz sencilla, por ejemplo .:

    interface IServerMapPath { 
        string MapPath(string virtualPath); 
    } 
    
    class ServerMapPath: IServerMapPath { 
        public string MapPath(string virtualPath) { 
         return HostingEnvironment.MapPath(virtualPath); 
        } 
    } 
    
    container.AddComponent<IServerMapPath, ServerMapPath>(); 
    

Luego se inyectan IServerMapPath en su RegisterRoutes.

+0

gracias por la actualización, sin dudas lo revisaré. – Herman

Cuestiones relacionadas