【问题标题】:Resolve controller: "Make sure that the controller has a parameterless public constructor"解析控制器:“确保控制器具有无参数的公共构造函数”
【发布时间】:2014-11-05 08:05:50
【问题描述】:

我的项目中有几个 Web API 控制器。在大量冗余代码之后,我将它们重构为下面的代码,这似乎是高度可重用的。但是,我突然收到错误Make sure that the controller has a parameterless public constructor,这似乎是由 Ninject 无法解析控制器绑定引起的。我不确定如何绑定它们。

我的代码:

public interface IController<T, TK>
{
    DataSourceResult Get(DataSourceRequest request);
    T Get(TK id);
    HttpResponseMessage Post(T model);
    T Put(T model);
    TK Delete(TK id);
}

public abstract class BaseController<T, TK> : ApiController, IController<T, TK>
{
    private readonly IRepository<T, TK> repository;

    public BaseController(IRepository<T, TK> repository)
    {
        this.repository = repository;
    }

    /* methods here */
}

public class ReceiptsController : BaseController<ReceiptViewModel, long>
{
    public ReceiptsController(IRepository<ReceiptViewModel, long> repository) :
        base(repository)
    {
    }
}

在 ninject RegisterServices 方法中,我尝试了以下方法:

kernel.Bind<IController<OntvangstViewModel, long>>().To<OntvangstenController>();
kernel.Bind<BaseController<OntvangstViewModel, long>>().To<OntvangstenController>();

但似乎两者都不起作用。我的实现或继承是否错误?还是我应该以不同的方式绑定它们?

【问题讨论】:

  • Hmmmmmmm....我想先看看这个video。然后重新设计您的应用程序。
  • 看了大约一百万篇关于为什么存储库是自发现火灾以来最好的东西的文章后,该视频看起来非常有趣。我回家后看看。

标签: c# asp.net-web-api ninject


【解决方案1】:

关于存储库的讨论非常多,您可以阅读数天。我可以指出让您的代码更好的一件事是:

public class ReceiptsController : ApiController
{
    public ReceiptsController()
    {
    }

    public List<Receipt> Get()
    {
        List<Receipt> receipts = new List<Receipt>();
        using (var context = new DbContext())
        {
            receipts = context.Receipts.ToList();
        }

        return View(receipts);
    }
}

您不需要存储库。他们并没有真正给你任何好处。事实上,他们从DbContext 中删除了很多优点。在我的示例中,您根本不必担心任何注入。

仔细查看DbContext

它被包裹在using 中。这意味着,当您使用完数据库连接,或者您的数据库事务抛出错误时,您的连接将被正确处理。在您的场景中似乎没有发生的事情 - AFAIK。

其次,我的例子写的时间更少,因为我还没有写过;控制器类,它的接口,存储库的通用实现,存储库的具体实现。这就是我绕过的 4 个类。

恕我直言 - 我的方法更简单,编写的代码更少。更安全。

【讨论】:

  • 我一直专注于“以正确的方式”做事,以至于完全忘记了重要的事情——把事情做好。退后一步后,我意识到我的方法对于这个项目来说确实是不必要的。
  • 以上是“正确的方式”,不是因为意见,而是因为它做了什么。它确实在请求范围内正确处理上下文。它确实在DbContext 上公开了有用的功能。在考虑您需要在项目中做什么时,请考虑您首先使用的框架需要什么。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-04-28
相关资源
最近更新 更多