2

我對Ninject很新。我想找到一種方法將控制器的Modelstate進一步傳遞給服務層。如何使用Ninject將ModelState注入爲參數?

我現在所擁有的:

 private readonly IAccountService service; 

     public AccountController(ILanguageService ls, ISessionHelper sh) 
     { 
      this.service = new AccountService(new ModelStateWrapper(this.ModelState)); 
      this.languageService = ls; 
      this.sessionHelper = sh; 

     } 

    public AccountService(IValidationDictionary validationDictionary) 
    { 
     this.validationDictionary = validationDictionary; 
    } 

想我想以某種方式:

 private readonly IAccountService service; 

     public AccountController(ILanguageService ls, ISessionHelper sh, IAccountService as) 
     { 
      this.service = as; 
      this.languageService = ls; 
      this.sessionHelper = sh; 

     } 

    public AccountService(IValidationDictionary validationDictionary) 
    { 
     this.validationDictionary = validationDictionary; 
    } 

但是就像你看到的AccountService將永遠無法接收IValidationDictionary,因爲它從來沒有作爲參數從AccountController發送。

是否有可能實現這一目標?或者這只是我必須忍受的事情之一?

回答

2

ModelState是應用程序的運行時狀態的一部分。因此,在您使用Ninject編寫應用程序時,它不可用。

您可以通過創建一個Abstract Factory來創建您的AccountService並使其成爲應用程序運行時狀態的一部分,從而解決此限制。

public interface IAccountServiceFactory 
{ 
    IAccountService Create(IValidationDictionary validationDictionary); 
} 

public class AccountServiceFactory 
{ 
    public IAccountService Create(IValidationDictionary validationDictionary) 
    { 
     return new AccountService(validationDictionary); 
    } 
} 

然後在您的AccountController中,注入一個AccountServiceFactory而不是AccountService。

private readonly IAccountServiceFactory serviceFactory; 

    public AccountController(ILanguageService ls, ISessionHelper sh, IAccountServiceFactory asf) 
    { 
     this.serviceFactory = asf; 
     this.languageService = ls; 
     this.sessionHelper = sh; 

    } 

    public void DoSomething() 
    { 
     var accountService = this.serviceFactory.Create(new ModelStateWrapper(this.ModelState)); 

     // Do something with account service 
    } 

或者,您可以通過每個公共方法調用直接將運行時依賴關係傳遞到帳戶服務。

this.service.DoSomething(new ModelStateWrapper(this.ModelState)); 
+0

我認爲你答案中的最後一句是正確的解決方案。由於ModelState是運行時數據(並非真正的上下文信息),因此它應該繼續傳遞。在這種情況下使用工廠來構建帳戶服務僅僅是醜陋的,因爲它仍然會通過延遲創建帳戶服務來破壞依賴關係圖,並且不必要地複雜化代碼。所以,爲你的最後一句話+1。 – Steven 2015-03-19 22:09:42

相關問題