如何使用温莎城堡与 mvc Web 应用程序不同的程序集
本文关键字:应用程序 程序集 Web mvc 何使用 城堡 | 更新日期: 2023-09-27 18:36:43
我被困住了。我想在不同的类库中配置温莎城堡,我配置了,构建很好,没有错误,好的......但是我在运行时遇到异常。
Castle.MicroKernel.ComponentNotFoundException:找不到支持服务App.Web.UI.Controllers.HomeController的组件
当我将配置文件返回到同一程序集 (App.Web.UI) 时,我在运行时没有任何异常,工作正常。
我尝试了很多方法,但我做不到。除了 FromThisAssembly 之外,还有其他绑定方法吗?还是解决方案?
温莎城堡配置在这里:
namespace App.Infrastructure.Configurations
{
public class WindsorControllerFactory : DefaultControllerFactory
{
private readonly IKernel _kernel;
public WindsorControllerFactory(IKernel kernel)
{
_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<IController>().Unless(x => x.Name == "BaseController").LifestyleTransient());
}
}
public class ServiceInstaller : IWindsorInstaller
{
public void Install(IWindsorContainer container, IConfigurationStore store)
{
container.Register(
Component.For(typeof (IRepository<>)).ImplementedBy(typeof (Repository<>)).LifestyleTransient(),
Component.For<IUserService>().ImplementedBy<UserService>().LifestylePerWebRequest(),
Component.For<IFormsAuthenticationService>().ImplementedBy<FormsAuthenticationService>().LifestylePerWebRequest(),
Component.For<ILoggingService>().ImplementedBy<LoggingService>().LifestyleTransient(),
Component.For<IFeedbackService>().ImplementedBy<FeedbackService>().LifestylePerWebRequest()
);
}
}
}
在您的代码中,Classes.FromThisAssembly()
引用包含 Windsor 内容的程序集,而不是您的 Web 应用程序。 尝试告诉温莎注册特定程序集中的组件。 这应该有效:
Classes.FromAssembly(Assembly.GetEntryAssembly())
条目程序集应该是运行 MVC 代码的应用域。