为什么BaseController的重载构造函数没有被执行?

时间:2010-07-09 11:45:34

标签: c# asp.net-mvc constructor controller structuremap

我有一个基本控制器,定义如下,但是ISiteService的构造函数永远不会被执行:

public class BaseController : Controller
{
    private ISiteService _siteService;

    public BaseController() {}

    public BaseController(ISiteService siteService)
    {
        _siteService = siteService; // this never gets hit..
    }

    protected override void Initialize(RequestContext rc)
    {
        string host = ((rc.HttpContext).Request).Url.Host; 
        Site site = _siteService.GetSiteByHost(host); // so _siteService is null...

        base.Initialize(rc);
    }
}

有人可以告诉我为什么会这样吗?我需要做什么才能让这个构造函数执行?

实现BaseController的所有控制器都有构造函数,这些构造函数接受StructureMap提供的各种参数,并且所有这些构造函数都被执行。

我不知道它是否相关,但这就是我为依赖注入配置StructureMap的方法。

private void ConfigureNonOptionalDependencies()
{
    // all other dependencies are registered same as this, 
    // and the constructors all get hit
    ForRequestedType<ISiteService>()
        .TheDefaultIsConcreteType<SiteService>();
}

我对StructureMap不熟悉,所以我不知道它是否与此问题有关,或者它是否更像是一个MVC问题。或者它甚至可能吗?感谢

修改

另外,我试过这个:

public class GroupController : BaseController
{

    private readonly IGroupService _groupService;

    private readonly ISiteService _siteService;

    public GroupController() {}

    public GroupController(
        ISiteService siteService
        ): base(siteService)
    {
        _siteService = siteService;
    }
}

3 个答案:

答案 0 :(得分:6)

您的子类构造函数是否包含对base的调用?

e.g。

public MyController(ISiteService siteService) : base(siteService)
{
    //do some MyController specific stuff
}

答案 1 :(得分:0)

如果您已经通过结构图加载控制器,为什么不只是取消无参数构造函数?你不再需要它了,它可能让某些东西感到困惑。 。

答案 2 :(得分:0)

结构图NuGet与MVC和API项目不同。 好像你已经为MVC项目安装了NuGet。

尝试安装StructureMap.WebApi2