【问题标题】:IoC Castle Windsor - No parameterless constructor defined for this objectIoC Castle Windsor - 没有为此对象定义无参数构造函数
【发布时间】:2014-03-05 01:49:15
【问题描述】:

当控制器及其依赖项使用 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;
    }

当我加载应用程序时,容器加载正常,所有依赖项都根据调试时的屏幕截图解析。

任何人都知道我的失败在哪里。提前致谢。

【问题讨论】:

    标签: asp.net-mvc inversion-of-control castle-windsor ioc-container


    【解决方案1】:

    当我加载应用程序时,容器加载正常,所有依赖项都根据调试时的屏幕截图解析。

    是的,您的所有类型都已注册。

    如果你在Global.asax 中写var controller = container.Resolve&lt;PersonController&gt;();,你应该得到你的控制器的一个实例。

    您的实现对 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);
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-03-29
      • 2016-04-25
      • 2018-02-11
      • 1970-01-01
      相关资源
      最近更新 更多