【问题标题】:How to inject ModelState as parameter with Ninject?如何使用 Ninject 注入 ModelState 作为参数?
【发布时间】:2015-03-19 09:40:16
【问题描述】:

我对 Ninject 很陌生。我想找到一种方法将控制器的模型状态进一步传递给服务层。

我现在拥有的:

       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 发送。

有可能实现吗?或者这只是我必须忍受的事情之一?

【问题讨论】:

    标签: asp.net-mvc asp.net-mvc-3 dependency-injection ninject ninject.web.mvc


    【解决方案1】:

    ModelState 是应用程序 runtime 状态的一部分。因此,在您使用 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));
    

    【讨论】:

    • 我认为您答案中的最后一句话是正确的解决方案。由于 ModelState 是运行时数据(而不是真正的上下文信息),它应该只是传递。在这种情况下,使用工厂来构建帐户服务只是丑陋的,因为它仍然会通过延迟帐户服务的创建来破坏依赖关系图,并使代码不必要地复杂化。所以为你的最后一句话+1。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-05-13
    • 2018-03-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多