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

相关问题