Pregunta

Nuevo en Castillo / Windsor, por favor, ten paciencia conmigo.

Actualmente estoy usando el marco System.Web.Mvc.Extensibility y en su puesta en marcha código, 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 ser PerWebRequest.

así que tengo 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

lo cual hice bajo <system.web> y <system.webServer>, sin embargo, todavía estoy recibiendo el mismo error. ¿Alguna pista?

Gracias de antemano.

Actualizar

bloque de código añadido por petición

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 necesito getInstance (resolver) un HttpContextBase objeto tal que pueda obtener la ruta del servidor de un fichero XML.

¿Fue útil?

Solución

Al escribir estas líneas, el estilo de vida PerWebRequest no soporta la resolución en Application_Start ().

Ver descripción de su tema y la discusión:

soluciones para este caso en particular:

  1. Registro RegisterRoutes como un ejemplo, pasando de forma explícita el contexto actual como parámetro constructor, por ejemplo:.

    container.Register(Component.For<IBootstrapperTask>()
                                .Instance(new RegisterRoutes(Context)));
    
  2. Uso HostingEnvironment.MapPath en lugar de contextBase.Server.MapPath. Querer hacer que se mockable? Se usa 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>();
    

A continuación, IServerMapPath inyectar en su RegisterRoutes.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top