18 January 2011 Castle Windsor, IoC, MVC Robert Muehsig

image

Ich benutze als IoC Framework Castle Windsor in einem ASP.NET MVC Projekt und bekam ein kleines Problem. Damit der IoC auch die Abhängigkeiten der Controller auflösen kann, müssen wir alle Controller ebenfalls in den Container hängen... doch das hatte einen kleinen Nebeneffekt.

Wir hängen alle unsere Controller in den Container über diesen Code. Der Woraround auf Zeile 8 behebt das Problem von oben.

private void InstallControllers(IWindsorContainer container)
        {
            var controllerTypes =
                 from t in typeof(HomeController).Assembly.GetTypes()
                 where typeof(IController).IsAssignableFrom(t)
                 select t;

            // workaround http://stackoverflow.com/questions/2784846/castle-windsor-controller-factory-and-renderaction
            foreach (Type t in controllerTypes)
                container.Register(Component.For(t).LifeStyle.Is(LifestyleType.Transient).Named(t.FullName));
        }

Das Problem tritt auf, wenn man z.B. als LifestyleType.WebRequest reingibt und über RenderAction einen Controller mehrmals aufruft - das mag das Framework nicht und es kommt die schicke Fehlermeldung. Der Grund ist einfach: Es kommt ein HttpRequest an, also wird genau eine Instanz von Controller erstellt. Auf diese Instanz will er dann über RenderAction mehrmals zugreifen, was aber wohl nicht geht:

A single instance of controller 'MyController' cannot be used to handle multiple requests. If a custom controller factory is in use, make sure that it creates a new instance of the controller for each request.

Der Fix: Als LifestyleType.Transient und das Problem war erstmal weg - ob das gut ist, kann ich noch nicht genau bestimmen ;)


Written by Robert Muehsig

Software Developer - from Saxony, Germany - working on primedocs.io. Microsoft MVP & Web Geek.
Other Projects: KnowYourStack.com | ExpensiveMeeting | EinKofferVollerReisen.de