2012-08-01 78 views
0

我正在嘗試在我的應用程序中獲得一個基本服務層,但我遇到了麻煩。MVC3 - 讓服務層正常工作

接口:

public interface IEmailer 
    { 
     string ServiceTest(); 
    } 

服務:

public class SimpleMailer : IEmailer 
    { 
    public string ServiceTest() 
     { 
      var ServiceVar = "This is your service working"; 
      return ServiceVar; 
     } 
    } 

控制器:

public class EmailSendController : Controller 
    { 

    private IEmailer _service; 

    public EmailSendController() 
     { 
      _service = new SimpleMailer(); 

     } 

     public EmailSendController(IEmailer service) 
     { 
      _service = service; 
     } 

     [HttpPost] 
     public ActionResult Edit() 
     { 

      _service.ServiceTest(); 

      return View(); 
     } 
    } 
} 

我得到一個錯誤,_service.ServiceTest();爲空。我做錯了什麼,阻止它返回ServiceVar

+0

什麼是您看到的錯誤消息? – HatSoft 2012-08-01 19:03:34

+0

+ \t \t $例外\t {「對象引用未設置爲對象的實例。」} \t System.Exception {System.NullReferenceException} – user547794 2012-08-01 19:05:00

+0

您的代碼適用於我。我得到'_service.ServiceTest()'返回字符串「這是你的服務工作」我使用兩個控制器構造函數進行測試。 – 2012-08-01 19:09:55

回答

1

這一切都取決於什麼控制器構造函數被擊中。如果你敲擊帶IEmailer參數的構造函數,那麼你需要創建SimpleMailer具體類來提供給構造函數。使用該實例創建此控制器的典型方法是使用依賴注入。我假設它正在試圖用該構造函數創建控制器,因爲發生了空引用異常。

您能否將您的Ninject映射代碼和Global.asax.cs代碼一起發佈,以便我們可以準確瞭解您的Ninject容器實現方式?如果沒有看到代碼,很難指出問題所在。

您不僅需要在Application_start中設置容器,還需要一個Ninject的IDependencyResolver實現,如果你看,它應該可以通過NuGet使用。這就是控制器將能夠查看其參數的具體實現以創建控制器的方式。

+0

我目前使用Ninject進行依賴注入。這裏是我的綁定代碼:kernel.Bind ().To ();這是不正確的? – user547794 2012-08-01 19:39:13

+0

我以前只使用過StructureMap和Unity。在你的構造函數中放置一個斷點,並查看該構造函數中的參數是否已經提供了SimpleMailer對象。我猜它是空的B/C你的容器沒有正確設置。你可以顯示你的ninject容器代碼嗎? – JustinMichaels 2012-08-01 19:46:37

+0

@ user547794看看[鏈接](http://www.shahnawazk.com/2010/12/dependency-injection-in-aspnet-mvc-3.html) – JustinMichaels 2012-08-01 19:52:47

0

確保你在以下的NinjectWebCommon.cs - >RegisterServices()(或global.asax - >CreateKernel()如果你用這種方式):

kernel.Bind<IEmailer>().To<SimpleMailer>().InRequestScope(); 

此外,刪除你的無參數的構造函數(或 'REM' 它爲了測試這是通過Ninject工作,否則參數化的Ctor將永遠不會被擊中。

[編輯]剛剛注意到,你有沒有HttpGet操作方法在你的代碼,所以我建議你改變HttpPost行動HttpGet的簽名,否則,你就沒有調用從GET請求的方式目前存在於你的控制器中的任何東西。

+0

它看起來沒有任何構造函數被擊中。我確實刪除了無參數的構造函數,並收到相同的錯誤。 – user547794 2012-08-01 20:02:52

+0

一個簡短的問題,我不幸得不得不出來,你有沒有嘗試使編輯行動一個'HttpGet'並從地址欄調用它。作爲代碼的立場,我不能看到你可以測試,因爲沒有'HttpGet'行爲方法 – 2012-08-01 20:06:50