1

我有一个由另一个控制器继承的 BaseController,

基础控制器:

public partial class BaseController : Controller
{
        private readonly IUnitOfWork _uow;
        private readonly INewsService _newsService;

        protected BaseController(IUnitOfWork uow, INewsService newsService)
        {
            _uow = uow;
            _newsService = newsService;
        }

//...

}

控制器之一:

public partial class HomeController : BaseController
{

    private readonly IUserService _userService;
    private readonly IMemberService _memberService;
    private readonly IUnitOfWork _uow;
    public HomeController(IUnitOfWork uow, IUserService userService, IMemberService memberService, INewsService newsService): base(uow, newsService)
    {
        _userService = userService;
        _memberService = memberService;
        _uow = uow;
    }

//...
}

但是对于 t4mvc 生成的类中的每个控制器,我都会遇到此错误,例如此错误:

'MvcApp.Controllers.BaseController' does not contain a constructor that takes 0 arguments.

HomeController.generated.cs文件中。

解决方案

https://stackoverflow.com/a/15320890/1719207

4

4 回答 4

1

听起来您的 IOC 容器(如果存在)没有覆盖默认控制器工厂。如果使用 Ninject,您应该安装 Ninject.MVC3 项目。每个容器都需要覆盖默认控制器工厂,以便它可以构建它们并注入依赖项。

对于 StructureMap,您需要StructureMap.MVC3StructureMap.MVC4

于 2013-03-09T17:47:45.967 回答
1

具有这种依赖关系的控制器闻起来很臭。这是我最近学到的技术术语^_^

一方面,我在动作过滤器中有 UoW 并使用属性来标记动作事务(在我的例子中,我将它与审计相结合)。其余的,如果它们真的那么复杂,可能应该有一个应用程序服务来包装它们。

只是一个想法。我是一个真正的初学者。

于 2013-03-09T19:42:44.483 回答
1

这类似于T4MVC 基本控制器没有默认构造函数

您可以将基本控制器更改为抽象的吗?如果是这样,我相信这将使事情顺利进行。

于 2013-03-10T01:49:30.667 回答
1

除了 David Ebbo 解决方案,这是

另一个解决方案:

我刚刚向我的基本控制器添加了一个默认构造函数,例如:

protected BaseController(){}

现在效果很好(在子类中没有 CodeRush 的“未实现基本类型构造函数”问题)。

于 2013-03-10T09:46:27.647 回答