2010-04-08 100 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