2013-11-02 13 views
6

Tôi đang cố gắng thiết lập Castle Windsor lần đầu tiên và tôi đang gặp một số vấn đề với nó. Tôi có ba dự án trong giải pháp của tôi:Thiết lập Castle Windsor trong MVC

  • miền
  • Dal
  • Web

Các dịch vụ được đặt tại Dal. Tất cả đều được kế thừa từ IService. (UserService triển khai IUserService, IUserService triển khai IService). Ứng dụng web là một ứng dụng MVC 5. Tất cả bộ điều khiển kế thừa từ BaseController.

tôi đã sử dụng this bài để giúp tôi thiết lập Windsor nhưng tôi tiếp tục nhận được ngoại lệ:

Một ngoại lệ của loại 'Castle.MicroKernel.ComponentNotFoundException' xảy ra ở Castle.Windsor.dll nhưng đã không được xử lý trong sử dụng đang

thông tin bổ sung: Không có thành phần để hỗ trợ các dịch vụ Solution.Web.Controllers.HomeController đã được tìm thấy

điều lạ là đường dẫn cho tiếp con lăn là chính xác.

Dưới đây là mã của tôi cho cấu hình:

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() 
     ); 
    } 
} 

Và trong 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); 
    } 
} 

Bất kỳ sự giúp đỡ hoặc hướng dẫn đi đúng hướng được đánh giá rất cao!

Trả lời

9

Tôi đã làm cho nó hoạt động. Vấn đề là các dịch vụ của tôi không được đăng ký. Tôi đã thay đổi ServiceInstaller và đăng ký trong 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

Vui mừng vì nó hoạt động ngay bây giờ. Bạn đã phải thay đổi đăng ký bộ điều khiển của bạn? – greyalien007

+0

Nope việc đăng ký của bộ điều khiển là chính xác. Cảm ơn một lần nữa cho những lời khuyên và giải thích! – Thijs

11

Tôi giả định nó thổi lên ở đây:

return (IController)kernel.Resolve(controllerType); 

gì bạn đang yêu cầu tòa lâu đài để làm ở đây bằng tiếng Anh là "cho tôi thành phần mà thực hiện một dịch vụ được định nghĩa bởi controllerType".

Sự cố xảy ra trong quá trình đăng ký bộ điều khiển của bạn.

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

Trong khối này, bạn đang yêu cầu lâu đài đăng ký tất cả các loại triển khai BaseController và các dịch vụ mà chúng đang hiển thị cũng là BaseController.

Vì vậy, lâu đài đang tìm kiếm một thành phần đáp ứng các dịch vụ HomeController và không thể tìm thấy bất cứ điều gì vì dịch vụ duy nhất bạn đã có được BaseController.

câu chuyện dài ngắn, nếu bạn loại bỏ

.WithServices(typeof(BaseController)) 

Castle sẽ cho rằng mỗi người trong số các bộ điều khiển của bạn là một dịch vụ và sau đó bạn có thể yêu cầu cho các thành phần mà thực hiện điều khiển của bạn theo cách mà bạn muốn.

Như một lưu ý riêng biệt, để rõ ràng tôi muốn thay đổi Types.FromThisAssembly() thành Classes.FromThisAssembly() vì bạn chỉ tìm kiếm các lớp, không phải bảng/lớp/giao diện, v.v. Các loại sẽ quét.

+0

Tôi đã thực hiện các thay đổi mà bạn đã đề xuất nhưng tôi vẫn gặp lỗi tương tự. Cảm ơn bạn đã giải thích chi tiết về lâu đài :) – Thijs

Các vấn đề liên quan