2009-07-03 14 views
2

Ist es möglich, IPrincipal mit Castle Windsor in meine asp.net mvc-Controller zu injizieren. Dieser Artikel von Scott Hanselman hat Code in den Kommentaren, um es mit Strukturkarte zu tun, aber ich kann nicht herausfinden, wie es mit Castle zu tun.Castle Windsor und IPrincipal

Update:

Hier ist, was ich mit meiner Controller Fabrik endete. Beachten Sie, dass der Großteil des Codes von Steve Sandersons Pro ASP.NET MVC-Buch mit dem Code aus den Antworten unten stammt.

+0

Ich würde die Einrichtung und IPrincipal innerhalb der Controller-Fabrik nicht registrieren, sie sind nicht verwandt und sollten getrennt sein. –

Antwort

11

zu bekommen Wenn Sie Windsor mit 2.0 sind, gibt es keine Notwendigkeit, den Controller zu ändern:

var container = new WindsorContainer(); 
container.AddFacility<FactorySupportFacility>(); 
container.Register(Component.For<IPrincipal>() 
    .LifeStyle.PerWebRequest 
    .UsingFactoryMethod(() => HttpContext.Current.User)); 
// your component registrations... 

Dies ist nur ein Wrapper rund um die Factory-Einrichtung Konfiguration. Wenn Sie eine frühere Version (RC3) verwenden, können Sie configure this with XML too.

+1

Oh schön. Wusste nicht, dass Windsor Unterstützung für FactoryMethods bekam. Aber der Fragesteller verwendet offensichtlich die XML-Konfiguration, daher funktioniert AddComponentInstance unabhängig von der Version. – Tigraine

+0

Factory Support war schon lange da, lange bevor die fließende Config API ... Ich habe einen Link zu den relevanten Dokumenten hinzugefügt. –

+0

Dies wurde zu den Windsor FAQ hinzugefügt: http://using.castleproject.org/display/IoC/FAQ –

2

Sie versuchen, Windsor bauen Sie Ihr IPrincipal, wo es nur die verwenden muss, die dort ist. Inject in den Container durch die AddComponentInstance-Methode, die vom MicroKernel in Ihrer ControllerFactory angezeigt wird.

Dies würde natürlich eine benutzerdefinierte ControllerFactory erfordern, aber Sie sollten das bereits haben.

habe ich etwas ähnliches für Httpcontext vor einiger Zeit: http://www.tigraine.at/2009/01/21/aspnet-mvc-hide-the-httpcontext-services-with-windsor-and-a-custom-controllerfactory/comment-page-1/#comment-2645

Ihr Controller Fabrik könnte wie folgt aussehen:

public IController CreateController(RequestContext requestContext, string controllerName) 
{ 
    container.Kernel.AddComponentInstance<IPrincipal>(typeof (IPrincipal), 
                  System.Web.HttpContext.Current.User); 
    return (IController) container.Resolve(controllerName); 
} 

(Vergessen Sie nicht, dass Ihr Controller pro-web- sein müssen Anfrage oder transiente für dieses oder Sie werden in Schwierigkeiten)

Verwandte Themen