我的项目中有几个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>();
但似乎都不起作用。我的实现或继承是错误的吗?或者我应该以不同方式绑定它们吗?
答案 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个班级。
恕我直言 - 我的方式更轻松,编写代码更少。更安全。