2013-11-02 8 views
6

मैं पहली बार कैसल विंडसर सेट अप करने की कोशिश कर रहा हूं और मुझे इसके साथ कुछ समस्याएं आ रही हैं।एमवीसी में सेट कैसल विंडसर

  • डोमेन
  • दाल
  • वेब

सेवाओं दाल में स्थित हैं: मैं अपने समाधान में तीन परियोजनाओं की है। वे सभी IService से प्राप्त होते हैं। (UserService लागू IUserService, IUserService लागू IService)। वेब एप्लिकेशन एक एमवीसी 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 है।

तो महल एक ऐसे घटक की तलाश में है जो सेवा होमकंट्रोलर को संतुष्ट करता है और कुछ भी नहीं ढूंढ सकता क्योंकि आपके पास केवल एक ही सेवा बेसकंट्रोलर है।

लंबी कहानी संक्षेप में, आप

.WithServices(typeof(BaseController)) 

कैसल समझेंगे कि अपने नियंत्रकों में से प्रत्येक के एक सेवा है निकालें और फिर आप घटक है कि जिस तरह से है कि आप चाहते हैं कि आपका नियंत्रक को लागू के लिए पूछ सकते हैं।

एक अलग नोट के रूप में, स्पष्टता के लिए मैं श्रेणियों को बदल दूंगा। फ्रॉमइएस्प्लिब्स() कक्षाओं से। फ्रॉमइएस्प्लिब्स() क्योंकि आप केवल कक्षाओं की तलाश कर रहे हैं, स्टुक्ट/कक्षा/इंटरफेस नहीं, आदि कि प्रकार स्कैन करेंगे।

+0

मैंने आपके द्वारा सुझाए गए परिवर्तन किए हैं लेकिन मुझे एक ही त्रुटि मिल रही है। कैसल के विस्तृत स्पष्टीकरण के लिए धन्यवाद :) – Thijs

संबंधित मुद्दे