2010-07-09 107 views
1

我有如下定义一个基本的控制器,但构造函数的ISiteService从未得到执行:为什么BaseController的重载构造函数没有被执行?

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; 
    } 
} 
+0

向我们显示此BaseController的调用者代码。 – 2010-07-09 11:48:19

+0

你怎么知道基类构造函数永远不会被击中?什么是连锁效应? – Paolo 2010-07-09 11:59:40

+0

这不是一个真正的答案,但是你需要默认的构造函数吗?如果你没有那个,大概StructureMap会调用剩下的一个。 – 2010-07-09 12:46:24

回答

6

做你的子类的构造函数包括对base打个电话?

例如

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

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

0

结构映射对于MVC和API项目,NuGet是不同的。 好像你只为MVC项目安装了NuGet。

尝试安装StructureMap.WebApi2

相关问题