2009-07-03 24 views
2

Castle Windsorを使用してIPrincipalを私のasp.net mvcコントローラーに注入することは可能ですか? Scott Hanselmanによるこの記事では、構造マップでそれを行うためのコメントにコードがありますが、どのように城でそれを行うのか分かりません。城ウィンザーとIPrincipal

更新:

ここでは、私は私のコントローラの工場のためになってしまったものです。コードの大部分はSteve SandersonのPro ASP.NET MVCの本の中にあり、以下の答えのコードが追加されています。

+0

コントローラファクトリ内にファシリティとIPrincipalを登録しません。これらは無関係であり、分離する必要があります。 –

答えて

11

Windsor 2.0を使用している場合は、ControllerFactoryを変更する必要はありません。

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

これは、Factoryファシリティ設定のラッパーです。以前のバージョン(RC3)を使用している場合は、configure this with XML tooとすることができます。

+1

よかった。 WindsorがFactoryMethodsをサポートしていることを知らなかった。 しかし、Askerは明らかにXML構成を使用しているため、AddComponentInstanceはVersionに関係なく動作します。 – Tigraine

+0

流暢な設定APIの前に、工場サポートは長い間そこにありました...関連するドキュメントへのリンクを追加しました。 –

+0

これをWindsor FAQに追加しました。http://using.castleproject.org/display/IoC/FAQ –

2

ウィンザーがあなたのIPrincipalを構築して、そこにあるものだけを使用しなければならないようにしようとします。 ControllerFactoryのMicroKernelによって公開されているAddComponentInstanceメソッドを使用してコンテナに挿入します。

これは明らかにカスタムControllerFactoryを必要としますが、すでにそれがあるはずです。

私はいくつかの時間前のHttpContextのために類似した何かをした: http://www.tigraine.at/2009/01/21/aspnet-mvc-hide-the-httpcontext-services-with-windsor-and-a-custom-controllerfactory/comment-page-1/#comment-2645

お使いのコントローラの工場は、次のようになります。

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

(お使いのコントローラが毎WEB-なければならないことを忘れないでください要求または一時的なもの)

関連する問題