6

Castle Windsor を初めてセットアップしようとしていますが、いくつか問題があります。私のソリューションには 3 つのプロジェクトがあります。

  • ドメイン
  • ダル
  • ウェブ

サービスは DAL にあります。それらはすべて から継承しIServiceます。(UserService実装IUserServiceIUserService実装IService)。Web アプリケーションは MVC 5 アプリケーションです。すべてのコントローラは から継承しBaseControllerます。

この投稿を使用して Windsor をセットアップしましたが、例外が発生し続けます。

タイプ '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);
    }
}

正しい方向へのヘルプやガイダンスは大歓迎です!

4

2 に答える 2