Bitte senden Sie Parameter aus Sicht-Modell zur Konstrukteurs einer anderen Ansicht-Modell

StackOverflow https://stackoverflow.com/questions/4450712

  •  10-10-2019
  •  | 
  •  

Frage

Ich benutze Caliburn Mikro- und MEF in wpf und ich habe dieses Problem.

Ich schaffe Shell-View-Modell:

public interface IShellViewModel
{
    void ShowLogOnView();
    void ShowMessengerView(PokecAccount account);
}

[Export(typeof(IShellViewModel))]
public class ShellViewModel : Conductor<IScreen>, IShellViewModel
{
    public ShellViewModel()
    {
        ShowLogOnView();
    }

    public void ShowLogOnView()
    {
        ActivateItem(IoC.Get<LogOnViewModel>());
    }

    public void ShowMessengerView(PokecAccount account)
    {
        //send to constructor of MessangerViewModel paramter typeof PokecAccount(own class)
        ActivateItem(IoC.Get<MessengerViewModel>(account));
    }
}

Aus Sicht-Modell, das ich schaffen und zeigen in neue Ansicht-Modell

[Export]
public class LogOnViewModel : Screen, IDataErrorInfo, ILogOnViewModel
{


    [Import]
    private IShellViewModel _shellViewModel;

    [Import]
    private IPokecConnection _pokecConn;

    private PokecAccount _account;

    public void LogOn(string nick, string password)
    {
        _account = _pokecConn.LogOn(nick, password);
        if (_account != null)
        {
            //create new view-model and show it, problem is send parameter to construtor of MessengerViewModel
            _shellViewModel.ShowMessengerView(_account);
        }
    }
}

Das Problem ist hier

        //send to constructor of MessangerViewModel paramter typeof PokecAccount(own class)
        ActivateItem(IoC.Get<MessengerViewModel>(account));

New View-Modell

[Export]
public class MessengerViewModel : Screen, IMessengerViewModel
{
    private PokecAccount _account;

    public MessengerViewModel(PokecAccount account)
    {
        _account = account;
    }
}

Das Problem ist hier:

    //send to constructor of MessangerViewModel paramter typeof PokecAccount(own class)
    ActivateItem(IoC.Get<MessengerViewModel>(account));

Parameter IoC.Get () kann nur String sein.

Wie das lösen?

War es hilfreich?

Lösung

Ich würde nicht die IoC-Klasse in diesem Zusammenhang, da dies ein Beispiel für den Service Locator ist ein Anti-Muster, und wird nicht empfohlen. Rob erwähnt dies in seiner Caliburn.Micro Dokumentation. Sie können lesen Sie auch http://blog.ploeh.dk/2010/02/03 /ServiceLocatorIsAnAntiPattern.aspx für eine schöne Beschreibung des anti-Muster.

Stattdessen würde ich ein abstraktes Werk Muster, verwendet und weitergeben (eine Abstraktion) eine Fabrik in der Shell View-Modell. Dies kann Methoden hat ein neues Anmelde View-Modell und messenger View-Modell zu erstellen. In der konkreten Umsetzung dieser Fabrik, können Sie diese Ansicht Modelle von Hand, instanziiert und geben nur in den Informationen, die sie benötigen.

Ich würde auch den Verweis auf das Shell-View-Modell aus dem Anmeldeansicht Modell entfernen. Stattdessen entweder verwenden, Standard .NET Ereignisse, die die Shell abonnieren können, oder einen Blick auf den Fall Aggregator in Caliburn.Micro implementiert haben (eine Probe auf der Codeplex-Website verfügbar ist), die eine Implementierung des Mediators Entwurfsmuster ist. Das wird schön Entkopplung zwischen Ihrer Ansicht Modelle gewährleisten.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top