IoC Castle Windsor-没有为此对象定义无参数的构造函数 [英] IoC Castle Windsor - No parameterless constructor defined for this object

查看:180
本文介绍了IoC Castle Windsor-没有为此对象定义无参数的构造函数的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

当使用Castle Windsor通过(DI/IoC)模式相应地注册控制器及其依赖项时,我在控制器上得到了为此对象定义的无参数构造函数".有人可以看看以下内容并看到我的错误,因为我看不到它.

I'm getting the 'No parameterless constructor defined for this object' on my controller when the controller and its dependencies are being registered accordingly via (DI/IoC) pattern using Castle Windsor. Can someone take a look at the following and see my error because i can't see it.

在global.asax上注册的代码

Code for registration on 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;
    }

当我加载应用程序时,容器会很好地加载,并且所有依赖项都根据调试时的屏幕快照解决了.

When I load the application the container loads fine with all dependencies resolved as per screen shot on debug.

任何人都知道我的失败之处在哪里.预先感谢.

Anyone out there got any idea's where my failings lie. Thanks in advance.

推荐答案

当我加载应用程序时,容器会很好地加载,并且所有依赖项都根据调试时的屏幕快照解决了.

When I load the application the container loads fine with all dependencies resolved as per screen shot on debug.

是的,您的所有类型均已注册.

Yes, all your types are registered.

如果在Global.asax中编写var controller = container.Resolve<PersonController>();,则应该获得控制器的实例.

If you write var controller = container.Resolve<PersonController>(); in the Global.asax you should get an instance of your controller.

您的实现仅对Asp.Net WebApi有效,并且仅对System.Web.Http.ApiController有效.

Your implementation is valid for Asp.Net WebApi and it works for System.Web.Http.ApiControllers only.

您的代码无法正常工作,因为您的PersonController继承了System.Web.Mvc.Controller并且使用了System.Web.Mvc.DefaultControllerFactory.您可以在第一张图片中看到它.

Your code does not work properly because your PersonController inherits System.Web.Mvc.Controller and System.Web.Mvc.DefaultControllerFactory is used. You can see it in the first picture.

您应该在Global.asax中编写并注入自定义ControllerFactory以便创建Asp.Net MVC控制器.

You should write and inject your custom ControllerFactory in Global.asax in order to create Asp.Net MVC controllers.

    //Set the controller builder to use our custom controller factory
    var controllerFactory = new WindsorControllerFactory(container);
    ControllerBuilder.Current.SetControllerFactory(controllerFactory);

您可以阅读更多内容另一个SO问题的答案.

这是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);
    }
}

这篇关于IoC Castle Windsor-没有为此对象定义无参数的构造函数的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
相关文章
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆