2011-10-19 24 views
5

He estado usando el patrón de repositorio descrito en el blog de Bob Cravens para crear mi aplicación, pero soy un poco nuevo y sigo encontrando mi camino a su alrededor. Quiero inyectar mi objeto DataService en el constructor de mi ViewModel para poder crear un objeto SelectList y crear un cuadro desplegable en mi vista. Sin embargo, parece que no puedo conseguir que las vinculaciones funcionen, cada vez que creo ViewModel busca/ejecuta el constructor sin parámetros. He intentado varias formas de usar las respuestas aquí en SO, pero fue en vano. La ayuda sería muy apreciada.¿Cómo paso un objeto al constructor de mi VIewModel? ASP.NET MVC 3, Ninject

modelo de vista:

public class ServerCreateViewModel 
{ 
    public SelectList Companies { get; private set; } 

    public ServerCreateViewModel() 
    { 

    } 

    public ServerCreateViewModel(DataService _dataService) 
    { 

     Companies = new SelectList(_dataService.Companies.All(), "Id", "CompanyName"); 

    } 

módulo ninject:

 Bind<DataService>().ToSelf() 
      .InRequestScope(); 

     var _dataService = Kernel.Get<DataService>(); 

     Bind<ServerCreateViewModel>() 
      .ToSelf() 
      .WithConstructorArgument("_dataService", _dataService); 

     //Bind<ServerCreateViewModel>() 
     // .ToSelf() 
     // .WithConstructorArgument("_dataService", ctx => ctx.Kernel.Get<DataService>()); 

controlador:

public ActionResult Create(ServerCreateViewModel viewModel) 
    { 

     return View(viewModel); 
    } 

Respuesta

12

No debería estar haciendo eso!

Ver Modelos (todos los modelos, de hecho) deberían ser solo cubos con algunos datos. No deben depender de ninguna lógica comercial, servicios, etc.

Es responsabilidad del controlador llenar los modelos y pasarlos a las vistas.

public class ServerCreateViewModel 
{ 
    public SelectList Companies { get; private set; } 
} 

public ActionResult Create() 
{ 
    var viewModel = new ServerCreateViewModel 
    { 
     Companies = new SelectList(_dataService.Companies.All(), "Id", "CompanyName") 
    }; 

    return View(viewModel); 
} 

DataService debe ser inyectado en el controlador, no en el modelo de visualización.

+0

¡Gracias, así es como lo tenía inicialmente, pero no estaba seguro de si era la forma correcta de hacerlo! Aprecio que me hayan puesto en eso. – Kiada

+0

¿Podría explicar el voto abajo, por favor? –

Cuestiones relacionadas