2010-12-18 89 views
1

我使用Caliburn.Micto作爲我的WPF應用程序和MEF注入的MVVM框架。IoC-MEF注入問題

UML我的應用程序是這樣的:http://i54.tinypic.com/2n1b4mx.png

我的情況是:我在視圖模型-1創建(在項目LogOnViewModel)新視圖模型-2(在我的項目是MessengerViewModel)與外殼-view-model方法。

我需要從view-model-1傳遞對象到view-model-2的構造函數。

我從外部程序集中使用MEF的注入類,它是在boostraper類中加載的。

在創建新的視圖模式我用抽象工廠模式,這是我實現:

/// <summary> 
/// Factory interfaces 
/// </summary> 
public interface IViewModelFactory 
{ 

    ILogOnViewModel CreateLogOnViewModel(IShellViewModel shellViewModel); 
    IMessengerViewModel CreateMessengerViewModel(IShellViewModel shellViewModel, PokecAccount account); 
} 

/// <summary> 
/// Concrent implementation of factory 
/// </summary> 
[Export(typeof(IViewModelFactory))] 
public class DefaulFactoryViewModel:IViewModelFactory 
{ 
    #region Implementation of IViewModelFactory 

    //create start up view-model 
    public ILogOnViewModel CreateLogOnViewModel(IShellViewModel shellViewModel) 
    { 
    return new LogOnViewModel(shellViewModel); 
    } 

    //this method create new view model 
    //it is used in LogOnViewModel 
    public IMessengerViewModel CreateMessengerViewModel(IShellViewModel shellViewModel, PokecAccount account) 
    { 
    return new MessengerViewModel(shellViewModel, account); 
    } 

} 

我在殼視圖模型使用此工廠類。外殼視圖模型類如下所示:

/// <summary> 
/// Shell model interface 
/// </summary> 
public interface IShellViewModel 
{ 
    //create start up view-model 
    void ShowLogOnView(); 

    //this method create new view model 
    //it is used in LogOnViewModel 
    void ShowMessengerView(PokecAccount account); 
} 

[Export(typeof(IShellViewModel))] 
public class ShellViewModel : Conductor<IScreen>, IShellViewModel 
{ 
    //factory interface 
    private readonly IViewModelFactory _factory; 

    [ImportingConstructor] 
    public ShellViewModel(IViewModelFactory factory) 
    { 
    //inject factory 
    _factory = factory; 

    //show startup view model 
    ShowLogOnView(); 
    } 

    public void ShowLogOnView() 
    { 
    //create LogOnViewModel class with factory 
    var model = _factory.CreateLogOnViewModel(this); 

    ActivateItem(model); 
    } 

    /// <summary> 
    /// Create MessengerViewModel 
    /// </summary> 
    /// <param name="account">account in this case is send from LogOnViewModel class </param> 
    public void ShowMessengerView(PokecAccount account) 
    { 
    //create MessengerViewModel class with factory 
    var model = _factory.CreateMessengerViewModel(this, account); 

    ActivateItem(model); 
    } 
} 

} 

啓動視圖模型。 LogOnViewModel類:

public interface ILogOnViewModel : IScreen, IDataErrorInfo 
{ 
string Nick { get; set; } 
string Password { get; set; } 
bool CanLogOn { get; set; } 
void LogOn(string nick, string password); 
} 


public class LogOnViewModel : Screen, ILogOnViewModel 
{ 
/// <summary> 
/// inject class from external assembly 
/// after creation of this class is still null 
/// </summary> 
[Import] 
public IPokecConnection PokecConn { get; set; } 


private readonly IShellViewModel _shellViewModel = null; 

private PokecAccount _account = null; 

public LogOnViewModel(IShellViewModel shellViewModel) 
{ 
    _shellViewModel = shellViewModel; 
    _account = new PokecAccount(); 
} 


//CREATE NEW VIEW MODEL 
public void CreateNewView() 
{ 
    //create new view-model (MessengerViewModel) 
    _shellViewModel.ShowMessengerView(_account); 
} 

} 

MessengerViewModel類:

public interface IMessengerViewModel : IScreen 
{ 
BitmapImage AvatarImage { get; set; } 
string AvatarStatus { get; set; } 
KeyValuePair<string, Friend> SelectedFriend { get; set; } 
} 

public class MessengerViewModel : Screen, IMessengerViewModel 
{ 


[Import] 
private IPokecService _pokecService; 
[Import] 
private IPokecConnection _pokecConn; 
private IShellViewModel _shellViewModel = null; 
private PokecAccount _account = null; 

public MessengerViewModel(IShellViewModel shellViewModel, PokecAccount account) 
{ 
    _shellViewModel = shellViewModel; 
    _account = account; 
} 
} 

我有注入視圖模型類的問題。在創建視圖模型類時,我使用了工廠模式,但是我也需要從外部程序集中注入此類。

例如:創建LogOnVieModel類後,IPokecConnection PokecConn {get;設置;}仍然爲空。

在我的情況下最適合的解決方案是什麼?問題在哪裏?感謝您的幫助。

回答

1

您使用的工廠模式在組成ViewScreenModel類本身之外沒有做任何合成。如果不是通過注入創建的,則需要告訴MEF編寫視圖模型。在返回之前更新您的工廠類以組成實例;

public ILogOnViewModel CreateLogOnViewModel 
{ 
    var model = new LogOnViewModel(); 
    var container = // set this to your reference of CompositionContainer 
    container.ComposeParts(model); 

    return model; 
} 

...其中Bootstapper.Container是你的CompositionContainer實例。

另外還有一個說明,爲什麼你要另一個帳號,而不是用your current one