Come devo implementare un metodo generale che possa essere utilizzato su più modelli di vista?

1

Attualmente ho implementato un metodo in un modello per scattare una schermata simile a E.G.

Interfaccia

public interface ICapture {
 void CaptureMethod();
}

Questo è il modello che implementa quell'interfaccia

public class CaptureModel : ICapture {
    void CaptureMethod(){ //implement the code to take screen shot }
}

Ora voglio eseguire una schermata su uno o più modelli di visualizzazione, quindi avrei bisogno di istanziare e chiamare la funzione in questo modo.

public ViewModel(){
 void TakeScreenShotMethodOrCommandDontCare(){
   ICapture captureClass = new CaptureClass();
   captureClass.captureMethod
  }
}

Che ritiene SBAGLIATO dover istanziare un'istanza di un oggetto per chiamare una funzione che effettuerà uno screenshot.

Suppongo che potrei entrare nel modello di visualizzazione e avere il metodo di cattura dello screenshot, ma che porterebbe alla duplicazione del codice in tutti i modelli di vista con quella caratteristica.

Forse una classe di utilità statica, ma sicuramente sarebbe costosa sull'app.

Credo che se avessi un'interfaccia implementata da una classe base, il mio modello di visualizzazione potrebbe ereditare da quella classe base e implementare l'implementazione di base su qualsiasi modello di vista che desidero.

Quindi, per riassumere la mia domanda, se volessi implementare un metodo che catturasse schermate e ti piacesse mvvm, allora dove implementeresti?

    
posta Johnny 15.10.2018 - 10:51
fonte

2 risposte

2

Il tuo codice dovrebbe apparire così:

public class CaptureViewModel 
{
    ICapture captureService
    public CaptureViewModel(ICapture captureService) 
    {
        this.captureService = captureService
    }

    //bind this to the View
    public void TakeScreenShotCommand()
    {
        this.captureService.CaptureShot();
    }
}

L'implementazione di ICapture viene Istanziata nel contenitore DI con il ciclo di vita desiderato e iniettata nel ViewModel. Permettendoti di riutilizzare il codice su tutti i ViewModels

captureService è implementato in una classe di libreria da qualche parte.

public class CaptureService : ICapture
{
     public void CaptureShot() {...implementation code here }
}

il tuo contenitore DI o classe di avvio ha l'aspetto di

public void Main()
{
    var container = new DiContainerOfChoice();
    container.Register<ICapture>(new CaptureService());

    MainView = container.Resolve<MyView>();
    // view requires ViewModel which requires CaptureService, DI sorts it all out for you

    //poor mans DI
    var cs = new CaptureService(); //keep hold of this to pass into other view models
    MainView = new View(new Viewmodel(cs));
}
    
risposta data 15.10.2018 - 11:15
fonte
1

Personalmente, il modo in cui organizzo i miei progetti MVVM è che le classi del livello del modello conservino solo i dati. (Solitamente si tratta in particolare di dati che verranno conservati in qualche tipo di archivio dati).

Tutto il resto è contenuto nel livello ViewModel, con funzionalità codificate direttamente come parte di tale classe o iniettate come servizio esterno.

Quindi nel tuo caso, avrei implementato un'implementazione del servizio ICapture nel MainViewModel in cui CaptureMethod () restituisce un'istanza di una classe CaptureModel, anziché essere un metodo void.

    
risposta data 15.10.2018 - 11:54
fonte

Leggi altre domande sui tag