2011-09-12 15 views
4

私はCastle Windsor 3.0を使用しています。コントローラー(私はWCF機能とIoCをリポジトリー/サービス層に使用しました)を登録しようとするまで、完璧に機能しました。ここに私のコントローラのインストーラクラスは次のとおりです。城ウィンザー3.0とASP.NET MVCコントローラー

public class ControllersInstaller : IWindsorInstaller 
{ 
    public void Install(IWindsorContainer container, IConfigurationStore store) 
    { 
     RegisterAllBasedOnWithCustomComponentRegistration(container, typeof(IController), 
      typeof(HomeController).Assembly, 
      cr => cr.LifeStyle.Transient); 

    } 

    private void RegisterAllBasedOnWithCustomComponentRegistration(IWindsorContainer container, Type baseType, 
    Assembly assemblyWithImplementations, Func<ComponentRegistration, ComponentRegistration<object>> customComponentRegistrationCb) 
    { 
     container.Register(
      AllTypes.FromAssembly(assemblyWithImplementations) 
       .BasedOn(baseType) 
       .If(t => t.Name.EndsWith("Controller")) 
       .Configure(c => customComponentRegistrationCb(c))); 
    } 
} 

そして、ここでは私のコントローラの工場です:

public class WindsorControllerFactory : DefaultControllerFactory 
{ 
    private readonly IKernel _kernel; 

    public WindsorControllerFactory(IKernel kernel) 
    { 
     _kernel = kernel; 
    } 

    public override void ReleaseController(IController controller) 
    { 
     _kernel.ReleaseComponent(controller); 
    } 

    public override IController CreateController(System.Web.Routing.RequestContext requestContext, string controllerName) 
    { 
     var controllerComponentName = controllerName + "Controller"; 
     return _kernel.Resolve<IController>(controllerComponentName); 
    } 
} 

私のGlobal.asaxから、私は次のメソッドを呼び出します。FromAssembly

InversionOfControl.InstallControllers( 。この());

これは別のプロジェクトにあります。そして、そこに私がインストールコードを呼び出す操作を行います。私は何か間違ったことをやっているよう

public static void InstallControllers(IWindsorInstaller install) 
    { 
     _container.Install(install); 
    } 

それはそうと、私はそれが私のために、「もう一度awnyベータ版を使用することはありません」一瞬かもしれないので、私は願っています。

私は次の例外を取得:、私はあなたのControllerFactoryでコンテナ

+0

。実装クラスではなくコントローラをIControllerとして解決しようとしているようです。 –

+0

IControllerではなく、controllerNameのHomeControllerを正確に解決するよう求めています。私は間違ってそれを求めているかもしれない、私ではない? –

答えて

1

は、すべてのコンポーネント.WithServices(typeof演算(IController))と名前を追加します。

cr => cr.LifeStyle.Transient.Named(cr.Implementation.Name) 

と、あなたの登録は、次のようになります。これは、例外メッセージで、すべてがあります

.Register(
AllTypes.FromAssembly(assemblyWithImplementations) 
     .BasedOn(baseType) 
     .WithServices(typeof(IController)) 
     .If(t => t.Name.EndsWith("Controller"))...) 
+0

'WithService'部分が間違っていることを除いて、偶然にしか動作しません。 –

+0

はい、あなたは正しいです。この場合、WindsorControllerFactoryはMark Seemannが下記のようにリファクタリングする必要があります。 – isuruceanu

9

に登録されているデバッグモードでコントローラを見ることができますaltough System.Web.Mvc.IControllerが発見されたサービスをサポートするためのないコンポーネントをあなたはIControllerを解決するべきではなく、むしろ具体的なコントローラーのタイプを決めるべきです。ここで私はいつも使用して、典型的なウィンザーベースControllerFactoryです:この場合

public class WindsorControllerFactory : DefaultControllerFactory 
{ 
    private readonly IWindsorContainer _container; 

    public WindsorControllerFactory(IWindsorContainer container) 
    { 
     _container = container; 
    } 

    protected override IController GetControllerInstance(RequestContext requestContext, Type controllerType) 
    { 
     return (IController)_container.Resolve(controllerType); 
    } 

    public override void ReleaseController(IController controller) 
    { 
     _container.Release(controller); 
    } 
} 
+0

なぜ匿名のdownvoteですか? –

+0

それは私ではなかった、マーク –

+1

申し訳ありませんが私は間違って投票を投票して、私はあなたの解決策がよりエレガントであることを確認します。 – isuruceanu

関連する問題