解析控制器:“确保控制器具有无参数的公共构造函数”

时间:2014-11-05 08:05:50

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

我的项目中有几个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>();

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

1 个答案:

答案 0 :(得分: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个班级。

恕我直言 - 我的方式更轻松,编写代码更少。更安全。