Невозможно добавить контроллеры в Castle.Windsor в ASP.NET MVC
-
25-09-2019 - |
Вопрос
Учитывая следующие настройки, у меня есть три сборки.
Веб (ASP.NET MVC 3.0 RC1)
Моделей
Настойчивость (свободно Nibernate, Castle.windsor)
Это мой контроллер.
using System;
using System.Web.Mvc;
using Castle;
using Castle.Windsor;
using Castle.MicroKernel;
using Castle.MicroKernel.SubSystems;
using Castle.MicroKernel.Registration;
using Castle.MicroKernel.SubSystems.Configuration;
namespace Persistence.Installers
{
public class ControllerInstaller : IWindsorInstaller
{
public void Install(IWindsorContainer container, IConfigurationStore store)
{
container.Register(
AllTypes
.FromAssembly(System.Reflection.Assembly.GetExecutingAssembly())
.BasedOn<IController>()
.Configure(c => c.Named(
c.Implementation.Name.ToLowerInvariant()).LifeStyle.Transient));
}
}
}
Это моя контролируемая продукция ...
using System;
using System.Web;
using System.Web.Mvc;
namespace Persistence.Containers
{
/// <summary>
/// Utilize Castle.Windsor to provide Dependency Injection for the Controller Factory
/// </summary>
public class WindsorControllerFactory : DefaultControllerFactory
{
private readonly Castle.Windsor.IWindsorContainer container;
public WindsorControllerFactory()
{
container = WindsorContainerFactory.Current();
}
protected override IController GetControllerInstance(System.Web.Routing.RequestContext requestContext, Type controllerType)
{
return (IController)container.Resolve(controllerType);
}
}
}
Это мое Application_Start
в global.asax
файл..
protected void Application_Start()
{
AreaRegistration.RegisterAllAreas();
RegisterGlobalFilters(GlobalFilters.Filters);
RegisterRoutes(RouteTable.Routes);
// Register the Windsor Container
ControllerBuilder.Current
.SetControllerFactory(typeof(Persistence.Containers.WindsorControllerFactory));
}
Я получаю ошибку
Нет компонента для поддержки сервисной проекции .Web.controllers.homecontroller
на GetControllerInstance
.
Итак, я не совсем уверен, что я делаю не так, и почему я не могу зарегистрирован контроллеры.
Решение
Ваш замок Windsor Setup Code принадлежит в вашем веб-проекте. Это не имеет ничего общего с настойчивостью.
Это вызывает проблему, потому что ваша ControllerInstaller
Пытается зарегистрировать контроллеры в узел настойчивости, а не на веб-сборке со следующим кодом:
System.Reflection.Assembly.GetExecutingAssembly()
.
Поэтому переместите код IOC в веб-проект, и он найдет ваши контроллеры.