2014-11-05 101 views
0

我的项目中有几个Web API控制器。在大量冗余代码之后,我将它们重构为下面的代码,这似乎是高度可重用的。但是,我突然收到错误​​,这似乎是由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

看看这个:http://stackoverflow.com/questions/24254189/webapi-make-sure-that-the-controller-has-a-parameterless-public-constructor – 2014-11-05 08:10:05

+2

嗯mmmmm ....我想首先采取看看这个[视频](https://skillsmatter.com/skillscasts/5688-orms-you-re-doing-it-wrong)。然后重做你的应用程序。 – 2014-11-05 08:10:34

+0

在看到大约一百万篇关于为什么存储库是发现火灾以来最好的事情之后,该视频看起来非常有趣。我回家时会看看它。 – 2014-11-05 09:02:22

回答

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。其次,我的例子写的时间较少,因为我没有写过;控制器类,其接口,存储库的通用实现,存储库的具体实现。所以这是我已经规避的四类。

恕我直言 - 我的方式吨吨更容易,写的代码更少。更安全。

+0

我一直如此专注于做事“正确的方式”,我完全失去了重要的事情 - 完成任务。在退后一步之后,我意识到我的方法对于这个项目确实没有必要。 – 2014-11-05 09:00:53

+1

以上是一个“正确的方式”,不是因为意见,而是因为它的作用。它确实在请求范围内正确处理上下文。它在'DbContext'上暴露了有用的函数。在思考你需要在一个项目中做什么时,考虑一下你首先使用的框架需要什么。 – 2014-11-05 09:07:47

相关问题