castillo PerRequestLifestyle no reconoce
-
28-09-2019 - |
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.
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:
- http://support.castleproject.org/projects/ COI / temas / view / COI-TEMA-166
- http://groups.google.com/group/ castillo del proyecto a los usuarios / browse_thread / hilo / d44d96f4b548611e
soluciones para este caso en particular:
-
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)));
-
Uso
HostingEnvironment.MapPath
en lugar decontextBase.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
.
Otros consejos
Maby tratar de agregarlo en la sección Módulos, como aquí: IIS7 y problemas Castle.MicroKernel.Lifestyle.PerWebRequestLifestyleModule registrarse