Sto provando ad installare Castle Windsor per la prima volta e ho qualche problema con esso. Ho tre progetti in mia soluzione:Setup Castle Windsor in MVC
- dominio
- DAL
- Web
I servizi si trovano in DAL. Tutti ereditano da IService
. (UserService
strumenti IUserService
, IUserService
strumenti IService
). L'applicazione Web è un'applicazione MVC 5. Tutti i controller ereditano da BaseController
.
ho usato this post per aiutarmi messa a punto di Windsor, ma continuo a ricevere l'eccezione:
Un'eccezione di tipo 'Castle.MicroKernel.ComponentNotFoundException' si è verificato in Castle.Windsor.dll, ma non è stata gestita in user codice
Ulteriori informazioni: Nessun componente per supportare il servizio Solution.Web.Controllers.HomeController è stato trovato
la cosa strana è che il percorso per il cont il rullo è corretto
Qui di seguito è il mio codice per la configurazione:
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()
);
}
}
E nel 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);
}
}
Qualsiasi aiuto o di orientamento nella giusta direzione è molto apprezzato!
Cool contenta che ora funzioni. Hai finito per dover cambiare la registrazione del controller? – greyalien007
No, la registrazione del controller era corretta. Grazie ancora per i suggerimenti e la spiegazione! – Thijs