2014-11-05 74 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

相關問題