Frage

New Castle / Windsor, bitte Geduld mit mir.

Ich bin derzeit mit dem Rahmen System.Web.Mvc.Extensibility und up-Code in seinem Start, es registriert Httpcontextbase wie folgt aus:

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

Was ich tun wollte, ist das Verhalten zu ändern und den Lebensstil ändern Httpcontextbase PerWebRequest sein.

, so habe ich den Code der folgenden ändern:

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

Allerdings, wenn ich dies tun, ich habe folgende Fehlermeldung:

 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

, die ich unter <system.web> tat und <system.webServer> aber ich bin immer noch die gleichen Fehler. Irgendwelche Hinweise?

Vielen Dank im Voraus.

Aktualisieren

hinzugefügt Codeblock pro Anfrage

Im Rahmen system.web.mvc.extensibility gibt es eine Klasse extendedMvcApplication die erben von Httpapplication, und in der Application_Start Methode aufgerufen, ruft BootStrapper.Execute (). Diese Implementierung dieser Methode ist die folgende:

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;
        }
    }

Wie Sie sehen können, schleift sie durch eine Liste von IBootStrapperTask und versucht, sie auszuführen. Nun ist es so, dass ich eine Aufgabe habe, die die Routen in meiner Mvc app registrieren:

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"));
    }
}

Sie können sehen, dass ich zu getInstance (Entschlossenheit) benötigen eine Httpcontextbase solchen Objekt, dass ich den Server-Pfad einer XML-Datei erhalten.

War es hilfreich?

Lösung

Zum Zeitpunkt des Schreibens, PerWebRequest Lebensstil unterstützt nicht in Application_Start Lösung ().

Siehe Problem Beschreibung und Diskussion:

Umgehungen für diesen speziellen Fall:

  1. Register RegisterRoutes als Instanz, explizit den aktuellen Kontext als Konstruktor Parameter übergeben, z.

    container.Register(Component.For<IBootstrapperTask>()
                                .Instance(new RegisterRoutes(Context)));
    
  2. Verwenden HostingEnvironment.MapPath statt contextBase.Server.MapPath. Wollen Sie es mockable machen? Verwenden Sie es, über eine einfache Schnittstelle, z.

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

Dann inject IServerMapPath in Ihrem RegisterRoutes.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top