asp.net-mvc – IoC Castle Windsor – 没有为此对象定义的无参
当使用Castle Windsor通过(DI / IoC)模式相应地注册控制器及其依赖关系时,我在控制器上获得了“为此对象定义的无参数构造函数”.有人可以看看下面的内容,看看我的错误,因为我看不到它.
在global.asax上注册的代码 public class MyApplication : System.Web.HttpApplication { public MvcApplication() { this.container = new WindsorContainer().Install(new DependencyInstaller()); } protected void Application_Start() { AreaRegistration.RegisterAllAreas(); WebApiConfig.Register(GlobalConfiguration.Configuration); FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters); RouteConfig.RegisterRoutes(RouteTable.Routes); BundleConfig.RegisterBundles(BundleTable.Bundles); GlobalConfiguration.Configuration.Services.Replace(typeof(IHttpControllerActivator),new WindsorActivator(this.container)); } } 我的DI public class DependencyInstaller : IWindsorInstaller { public void Install(IWindsorContainer container,IConfigurationStore store) { container.Register( Component.For<IDatabaseFactory>().ImplementedBy<DatabaseFactory>().LifeStyle.PerWebRequest,Component.For<IUnitOfWork>().ImplementedBy<UnitOfWork>().LifeStyle.PerWebRequest,Component.For<IMappingEngine>().ImplementedBy<MappingEngine>().UsingFactoryMethod(() => Mapper.Engine).LifeStyle.Singleton,Component.For<IFirmTasks>().ImplementedBy<FirmTasks>().LifeStyle.PerWebRequest,Classes.FromAssemblyContaining<PersonController>().BasedOn<IController>().LifestyleTransient(),Classes.FromThisAssembly().BasedOn<IHttpController>().LifestyleTransient(),Classes.FromAssemblyNamed("Core.Firm.Tasks").Where(type => type.Name.EndsWith("Tasks")).WithServiceAllInterfaces().LifestylePerWebRequest(),Classes.FromAssemblyNamed("Core.Firm.Repository") .Where(type => type.Name.EndsWith("Repository")).WithServiceAllInterfaces().LifestylePerWebRequest() ); } } 我的控制器 public class PersonController : Controller { private IFirmTasks tasks; public PersonController(IFirmTasks tasks) { this.tasks = tasks; } 当我加载应用程序时,容器加载正常,所有依赖项按照调试时的屏幕截图解析. 那里的任何人都知道我的失败所在.提前致谢. 解决方法
是的,您的所有类型都已注册. 如果你写var controller = container.Resolve< PersonController>();在Global.asax中,您应该获得控制器的实例. 您的实现对Asp.Net WebApi有效,它仅适用于System.Web.Http.ApiControllers. 您的代码无法正常工作,因为您的PersonController继承了System.Web.Mvc.Controller并使用了System.Web.Mvc.DefaultControllerFactory.你可以在第一张图片中看到它. 您应该在Global.asax中编写和注入自定义ControllerFactory,以便创建Asp.Net MVC控制器. //Set the controller builder to use our custom controller factory var controllerFactory = new WindsorControllerFactory(container); ControllerBuilder.Current.SetControllerFactory(controllerFactory); 你可以阅读more in this answer on another SO question. 这是WindsorControllerFactory的默认实现: /// <summary> /// Controller factory the class is to be used to eliminate hard-coded dependencies /// between controllers and other components /// </summary> public class ControllerFactory : DefaultControllerFactory { private readonly IWindsorContainer container; public WindsorControllerFactory(IWindsorContainer container) { this.container = container; } public override void ReleaseController(IController controller) { container.Release(controller.GetType()); } protected override IController GetControllerInstance(System.Web.Routing.RequestContext requestContext,Type controllerType) { return (IController)container.Resolve(controllerType); } } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- asp.net-mvc – 为dnx rc2运行MVC 6 ASP.NET 5本地化示例
- 将经典ASP应用程序迁移到ASP.NET
- asp.net-mvc – 什么是HtmlHelper渲染htmlAttributes对象的
- asp.net – 单元测试Web服务 – HttpContext
- asp.net – 缓存在它应该到期之前到期
- asp.net-core – 当返回null而不是控制器中设置的值时,Mode
- asp.net – 检测是否加载了HttpModule
- asp.net – 动态加载不同控件时无法加载viewstate
- asp.net-mvc – ASP.NET MVC网格控件比较
- asp.net core 使用 signalR(一)
- asp.net-mvc-3 – 将ASP.NET MVC 3 Web角色添加到
- 创建ASP.NET移动Web应用程序时要记住的事项
- 记一次ASP.NET MVC性能优化(实际项目中)
- asp.net-mvc – ASP.NET MVC – 在客户端缓存页面
- ASP.NET:这个HttpModule有什么作用? System.Se
- asp.net-mvc-3 – ASP.NET MVC3 Razor:没有@if或
- asp.net – 如何防止在BundleTransformer中使用*
- 如何将ASP.NET用户控件转换为Web /复合控件?
- asp.net-mvc – 使用ASP.NET MVC的SEO URL
- asp.net – 很好的复杂linq到sql示例?