我可以在控制器的Initialize方法中访问模型信息吗?

时间:2011-12-12 11:32:21

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

在我的控制器中,我想设置以下服务:

    private IAccountService _accountService;
    private IDataSourceService _dataSourceService;
    private IProductService _productService;
    private ISequenceService _sequenceService;

    protected override void Initialize(RequestContext requestContext)
    {
        base.Initialize(requestContext);
    }

但是,设置它们需要我知道模型中属性的值来自视图并指定dataSourceID。

在控制器的Initialize方法中,模型信息是否可用?如果答案是否定的,我可以查看会话变量吗?

2 个答案:

答案 0 :(得分:0)

不要破解MVC框架的内部工作。在我看来,你想要做的事实上是控制反转,或依赖注入。它在MVC中得到很好的支持,你只需要让你的控制器的构造函数接受这些服务(作为接口)并设置IoC容器(MVC3内置的DependencyResolver与所有主要的IoC容器兼容 - 我个人喜欢Ninject)。有很多这方面的教程,例如Ninject可以通过nuget完全自动设置。

答案 1 :(得分:0)

我不确定你为什么要那样做。控制器不应该负责配置它的依赖性。您应该使用Inversion of Control(也就是依赖注入)容器来在构造函数中注入所有依赖项。

如果您的服务需要有关构造的特定模型信息,我强烈建议您查看您的体系结构,因为情况并非如此。最有可能的方法是在方法调用(方法注入)中传递该信息或将依赖项抽象为服务。

如果您需要存储在会话中的信息,您还可以考虑将会话包装在服务中。然后,您可以将会话服务作为依赖项注入。这也使得对控制器进行单元测试变得更加容易。