2013-11-02 104 views
6

我想第一次安裝溫莎城堡,我遇到了一些問題。我有我的解決方案三個項目:安裝在MVC的溫莎城堡

  • DAL
  • 網絡

的服務位於DAL。它們都從IService繼承。 (UserService器具IUserService,IUserService器具IService)。該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

我做到了。問題顯然是我的服務沒有註冊。我更改了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()); 

在該塊告訴城堡註冊您的所有類型的實現BaseController和它們暴露的服務也是BaseController。

因此,城堡正在尋找一個滿足服務HomeController的組件,並且找不到任何東西,因爲您獲得的唯一服務是BaseController。

長話短說,如果您刪除

.WithServices(typeof(BaseController)) 

城堡將假定每個控制器是一個服務,然後你可以要求實現你在你所希望的方式控制組件。

作爲一個單獨的說明,爲了清楚起見,我會將Types.FromThisAssembly()更改爲Classes.FromThisAssembly(),因爲您只查找類,而不是查找類,將掃描的類。

+0

我已經做出了您建議的更改,但我一直得到相同的錯誤。感謝您對城堡的詳細的解釋:) – Thijs