2010-05-21 4 views
0

J'ai un ViewModel, il faut deux paramètres dans le constructeur qui sont du même type:MVVM && CIO && Sous-ViewModels

public class CustomerComparerViewModel 
{ 
    public CustomerComparerViewModel(CustomerViewModel customerViewModel1, 
            CustomerViewModel customerViewModel2) 
    { 

    } 
} 

public class CustomerViewModel 
{ 
    public string FirstName { get; set; } 
    public string LastName { get; set; } 
} 

Si je n'utilisais pas du CIO je pouvais nouveau le viewmodel et passer les sous-viewmodels dedans. Je pourrais empaqueter les deux viewmodels dans une classe et passer cela dans le constructeur mais si j'avais un autre viewmodel qui a seulement besoin d'un CustomerViewModel je devrais passer dans quelque chose que le model viewm n'a pas besoin.

Comment puis-je gérer cela avec IOC? J'utilise Ninject btw.

Merci

Répondre

1

Voici comment faire dans Ninject:

Container.Bind<CustomerViewModel>().ToSelf().WhenTargetHas<CustomerA>(); 
Container.Bind<CustomerViewModel>().ToSelf().WhenTargetHas<CustomerB>(); 

Puis dans le constructeur de la classe que vous les utilisez dans:

public class CustomerComparerViewModel 
{ 
    public CustomerComparerViewModel([CustomerA]CustomerViewModel customerA, 
            [CustomerB]CustomerViewModel customerB) 
    { 

    } 
} 
1

Je ne suis pas familier avec Ninject, mais il me semble que pour le IoC savoir ce CustomerViewModels à Injecter dans votre constructeur vous devez configurer ces objets à l'avance. L'utilisation MEF comme les attributs et le code Psuedo il pourrait ressembler ...

[Export()] 
public class CustomerSelectorViewModel 
{ 
    [Export("CustomerA")] 
    public class CustomerViewModel FirstSelection {get;set;} 

    [Export("CustomerB")] 
    public class CustomerViewModel SecondSelection {get;set;} 
} 

[Export()] 
public class CustomerComparerViewModel 
{ 
    [ImportingConstructor] 
    public CustomerComparerViewModel([Import("CustomerA")]CustomerViewModel customerViewModel1, [Import("CustomerB")]CustomerViewModel customerViewModel2) 
    { 

    } 
}