2013-11-02 14 views
6

私はCastle Windsorを初めてセットアップしようとしています。私はそれにいくつか問題があります。城ウィンザーをMVCに設定

  • ドメイン
  • DAL
  • ウェブ

サービスはDALに配置されています。私は私の溶液中の3つのプロジェクトを持っています。彼らはすべてIServiceから継承しています。 (UserServiceIUserServiceを実装し、IUserServiceIServiceを実装しています)。 WebアプリケーションはMVC 5アプリケーションです。すべてのコントローラはBaseControllerから継承されます。

は、私は私のセットアップウィンザーを助けるためにthisポストを使用しますが、私は例外を得続ける:

型「Castle.MicroKernel.ComponentNotFoundException」の例外がCastle.Windsor.dllで発生したが、ユーザーに処理されませんでしたコード

追加情報:奇妙なことがあるSolution.Web.Controllers.HomeControllerが

発見されたサービスをサポートするためのノーコンポーネントその続きのパスローラーが正しい。以下は

は、コンフィギュレーションのために私のコードです:

public class WindsorControllerFactory : DefaultControllerFactory 
{ 
    private readonly IKernel kernel; 

    public WindsorControllerFactory(IKernel kernel) 
    { 
    this.kernel = kernel; 
    } 

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

    protected override IController GetControllerInstance(RequestContext requestContext, Type controllerType) 
    { 
    if (controllerType == null) 
    { 
     throw new HttpException(404, string.Format("The controller for path '{0}' could not be found.", requestContext.HttpContext.Request.Path)); 
    } 
    return (IController)kernel.Resolve(controllerType); 
    } 
} 

public class ControllersInstaller : IWindsorInstaller 
{ 
    public void Install(IWindsorContainer container, IConfigurationStore store) 
    { 
     container.Register(
      Classes.FromThisAssembly() 
      .BasedOn(typeof(BaseController)) 
      .LifestyleTransient()); 
    } 
} 

public class ServiceInstaller : IWindsorInstaller 
{ 
    public void Install(IWindsorContainer container, IConfigurationStore store) 
    { 
     container.Register(Types.FromAssemblyContaining(typeof(IService).GetType()) 
      .BasedOn<IService>().WithService.FromInterface() 
      .LifestyleTransient() 
     ); 
    } 
} 

そして、Global.asaxの中:右方向に

public class MvcApplication : System.Web.HttpApplication 
{ 

    private static IWindsorContainer container; 

    protected void Application_Start() 
    { 
     AreaRegistration.RegisterAllAreas(); 

     FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters); 
     RouteConfig.RegisterRoutes(RouteTable.Routes); 
     BundleConfig.RegisterBundles(BundleTable.Bundles); 

     // Setup Castle.Windsor IOC 
     MvcApplication.BootstrapContainer(); 
    } 
    protected void Application_End() 
    { 
     container.Dispose(); 
    } 

    private static void BootstrapContainer() 
    { 
     container = new WindsorContainer().Install(FromAssembly.This()); 
     container.Install(FromAssembly.Containing(typeof(IService).GetType())); 
     var controllerFactory = new WindsorControllerFactory(container.Kernel); 
     ControllerBuilder.Current.SetControllerFactory(controllerFactory); 
    } 
} 

すべてのヘルプやガイダンスは大歓迎です!

答えて

9

私はそれを仕事にしました。 Apperantly問題は私のサービスが登録されなかったことでした。 ServiceInstallerとGlobal.asaxの登録を変更しました。

public class ServiceInstaller : IWindsorInstaller 
{ 
    public void Install(IWindsorContainer container, IConfigurationStore store) 
    { 
     container.Register(Classes.FromAssemblyContaining<BaseService>() 
      .BasedOn(typeof(IService)) 
      .WithService.AllInterfaces() 
      .LifestyleTransient());    
    } 
} 

private static void BootstrapContainer() 
{ 
    container = new WindsorContainer(); 
    container.Install(new ServiceInstaller()); 
    container.Install(new ControllersInstaller()); 

    var controllerFactory = new WindsorControllerFactory(container.Kernel); 
    ControllerBuilder.Current.SetControllerFactory(controllerFactory); 
} 
+0

今はうれしい嬉しいです。コントローラの登録をまったく変更する必要はありませんでしたか? – greyalien007

+0

コントローラの登録が正しくありませんでした。ヒントと説明のためにもう一度おねがいします! – Thijs

11

私はそれがここで吹いていますと仮定しています:

return (IController)kernel.Resolve(controllerType); 

をあなたは英語でここに行うために城を求めていることは、「私にcontrollerTypeによって定義されたサービスを実装するコンポーネントを与える」されます。

コントローラの登録に問題があります。

container.Register(
     Types.FromThisAssembly() 
     .BasedOn(typeof(BaseController)) 
     .WithServices(typeof(BaseController)) 
     .LifestyleTransient()); 

このブロックでは、CastleControllerを実装するすべてのタイプを登録するようCastleに通知し、公開しているサービスもBaseControllerです。

したがって、CastleはサービスHomeControllerを満たすコンポーネントを探しています。唯一のサービスはBaseControllerなので何も見つかりません。

かいつまんで、あなたは

.WithServices(typeof(BaseController)) 

を削除する場合城はあなたのコントローラのそれぞれがサービスであると仮定しますと、あなたは、あなたが望む方法であなたのコントローラを実装するコンポーネントを求めることができます。

分かりやすくするため、タイプがスキャンするクラスやスタウト/クラス/インターフェイスなどではなく、Types.FromThisAssembly()をClasses.FromThisAssembly()に変更します。

+0

あなたが提案した変更を加えましたが、同じエラーが発生しています。キャッスルの詳細な説明をありがとうございました:) – Thijs

関連する問題