Asp.net mvc 我可以在控制器的初始化方法中访问模型信息吗?

Asp.net mvc 我可以在控制器的初始化方法中访问模型信息吗?,asp.net-mvc,asp.net-mvc-3,dependency-injection,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(Requ

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

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

    protected override void Initialize(RequestContext requestContext)
    {
        base.Initialize(requestContext);
    }
但是,设置这些属性需要知道模型中来自视图并指定dataSourceID的属性的值


在控制器的初始化方法中,模型信息可用吗?如果答案是否定的,那么会话变量是否可供我检查?

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

我不知道您为什么要这样做。控制器不应负责配置其依赖项。您应该使用控制反转(也称为依赖项注入容器)在构造函数中注入所有依赖项

如果您的服务需要关于构建的特定于模型的信息,我强烈建议您检查您的架构,因为不应该这样。最有可能的是,最好在方法调用方法注入中传递该信息,或者将依赖项抽象到服务中


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

我的情况可能不寻常。我有管理屏幕,每个屏幕都允许用户从许多不同的数据源位置选择数据源。我想在初始值设定项中设置我的服务实例,但是设置它们需要我知道用户选择了什么数据源。如果我没有在初始值设定项中这样做,那么我必须在每个操作中创建以datasource作为参数的服务实例;尽管它可能需要额外的抽象,因为并非所有数据访问服务的实例都使用相同的数据源。您可以提供一个服务来处理从公共名称中选择数据源的问题。如果您将该服务注入到数据访问服务中,它将允许您通过来自动作方法的每次调用传递数据源名称。如果您无法修改数据服务实现,您可以创建一个使用延迟依赖项创建策略(如委托或工厂)的包装器。查看MSN文档,我看到以下内容:无法直接调用此方法。重写此方法,以便在调用任何ActionResult方法之前提供其他处理任务,例如设置线程区域性或为TempData对象指定自定义提供程序。它不是在某种程度上说我可以重写这个方法来设置控制器方法吗?不,它不是。。这意味着当您需要一些非标准的数据提供程序时,重写initialize方法是最后的手段——我从未见过这样的需要。向控制器注入服务并不是这种情况,应该以常规方式进行——通过使用IoC容器的构造函数注入。