2012-02-06 9 views
14

¿Es posible usar ninject para la inyección de dependencia de modo que el resultado sea algo así como la inyección que puedo obtener en MVC? Para elaborar, si uso el adaptador ninject MVC puedo declarar que mis controladores web tienen parámetros de constructor que luego serían inyectados automáticamente por ninject.Inyección de constructor Ninject en WPF

Sin embargo, no he encontrado una extensión tal ninject para WPF, que me permita tener una ventana como esta:

public partial class MainWindow : Window 
{ 
    private readonly IService injectedService; 
    public MainWindow(IService injectedService) 
    { 
     this.injectedService = injectedService; 
    } 
} 

me gustaría hacer esto sin usar explícitamente el IKernel en mi Inicio de la aplicación principal para obtener una instancia de ventana principal. Preferiría usar el método normal de configuración xaml para obtener una instancia de la ventana principal y todas las ventanas posteriores.

¿Esto es posible? ¿Hay alguna forma de enganchar en la creación del objeto generado por xaml para modificarlo y usar Ninject para la inyección de dependencia del constructor?

+2

No creo que exista tal extensión, porque en WPF normalmente haces uso del patrón MVVM y así inyectaría los servicios en tus clases de ViewModel. –

+0

Pero, ¿no se crean los modelos a través del XAML también? Es cierto que no soy un experto en WPF, pero ¿no necesitarían los modelos el mismo tipo de inyección de dependencia? Me preocupa que mi contenedor muestre lo que impediría las pruebas unitarias del proyecto. – Dervall

+3

No, los ViewModels no se crean en XAML. Se crean en ViewModelLocator, consulte [aquí] (http://windowsphonegeek.com/articles/Working-with-a-simple-ViewModelLocator-from-MVVM-Lite) para ver un ejemplo. Sus Vistas o Modelos de Vista no saben nada sobre su contenedor de inyección de dependencia. –

Respuesta

17

En función de los comentarios & su confusión, parece que MVVM es una buena opción para usted. El desafío es APRENDER MVVM.

Así que abre una grieta good link y comienza a rodar. MVVM es sorprendentemente fácil de hacer, y es bastante fácil envolver todo con Ninject y ponerle un lazo.

La curva de aprendizaje inicial si NO utiliza una biblioteca de terceros para Ninject + MVVM como yo lo hice, es un poco abrupta. Así que aquí hay un par de cosas que tenía que entender:

 DataContext="{Binding Path=ResultViewModel,Source={StaticResource ServiceLocator}}" 

Esta pequeña adición hace que le permite activar ninject para obtener su información de modelo de vista de su XAML:

<Application.Resources> 
    <ioc:NinjectServiceLocator x:Key="ServiceLocator" /> 
</Application.Resources> 

este pequeño truco le permite asignar ese recurso estático de su archivo app.xaml a la clase relevante

public class NinjectServiceLocator 
{ 
    private readonly IKernel kernel; 

    public NinjectServiceLocator() 
    { 
     kernel = new StandardKernel(new MyMvvmModule()); 
    } 

    public ResultViewModel ResultViewModel 
    { 
     get { return kernel.Get<ResultViewModel>(); } 
    } 
} 

Esto es notable. Todos los modelos de vista se deben enumerar como una propiedad en ServiceLocator para que Ninject los genere. Finalmente, MyMvvmModule en el ejemplo anterior es la clase estándar de Ninject donde se sobrescribe para Load() y se vinculan todas las interfaces.

+0

Gracias, muy útil – Dervall

+1

@Dervall Gracias. Este tipo de publicación es lo que creo que Jeff Atwood imaginó para SO. Tuve un problema similar, así que compartí la información que descubrí después de investigarla durante horas, y espero que ahorre mucho tiempo en el futuro. – deltree

Cuestiones relacionadas