2010-04-08 62 views
0

如果你可以在你的IoC实现中注册你的控制器,那你为什么不能从你的IoC容器中创建你的ModelView?MVC 2,IoC,ModelView和Binding

我目前使用Autofac 1.4的IoC注射控制器具有以下:

ControllerBuilder.Current.SetControllerFactory((IControllerFactory) new AutofacControllerFactory(ContainerProvider)); 

我不明白的方式来告诉MVC到,虽然使用容器作为对象工厂为我的ViewModels,我在某个地方想念它吗?

+3

你为什么要IOC容器创建的ViewModels? – uvita 2010-04-08 19:55:18

+0

我的ViewModels是生成的Html页面的一个简化抽象,由域服务和对象组成。如果我有一个控制器回发方法“public virtual ActionResult MyMethod(MyDomainObject myDomainObject)”,并且MyDomainObject的构造函数具有可以通过IoC容器解决的依赖关系。我只是不明白为什么模型联编程序需要一个默认的构造函数,当控制器可以构造函数注入。有一个MVC方法“ControllerBuilder.Current.SetControllerFactory”我认为应该有一个“ControllerBuilder.Current.SetModelFactory”。 – Mike 2010-04-09 14:57:49

回答

1

由于你的控制器可能有多个视图,每个视图都有它自己的ViewModel,所以你通常不会通过contstructor注入来创建它们。

所以你可以注册你的视图模型与你的IoC,但这意味着在你的控制器提供一个服务定位器,以便获得ViewModel的一个实例。

builder.Register<MyViewModel>().As<IMyViewModel>().FactoryScoped(); 

,并在控制器

var MyViewModel = ContainerProvider.RequestContainer.Resolve<IMyViewModel>(); 

这不,除非你想让他们莫名其妙地动态管理您的控制器的ViewModels的典型方式。

在大多数情况下,你只是在你的控制器方法创建视图模型的实例

public ActionResult Details() 
{ 
    var model = new MyViewModel(); 

    return View (model); 
} 
+0

感谢您的回复。 看到我的评论上面的一些更详细的回应。它的要点是,在回发到控制器方法时,ModelBinders会创建对象的实例,然后使用来自发布数据的值填充它们。为什么MVC没有能力以与控制器从IoC容器提供的工厂一样的方式构建viewModel? – Mike 2010-04-09 15:07:48

+3

@Mike你总是可以创建一个自定义的ModelBinder,它使用IoC来获得ViewModel的一个实例。 – 2010-04-12 17:22:59