Il modello dati può avere riferimenti di business logic?

0

Questa è un'applicazione WPF che utilizza la progettazione MVVM che si collega ai Servizi (livello della logica aziendale) che gestiscono i Modelli, con l'eccezione che alcune serie di proprietà del modello sono associate direttamente ad alcune viste. Ciò significa che le proprietà del modello vengono aggiornate senza coinvolgere ViewModel in alcuni casi e questo schema di visualizzazione non può essere modificato a causa di specifiche limitazioni di integrazione.

Ilrequisitoècheinmolticasi,lamodificadelleproprietànelmodelloimplichialcunelogichedibusinessdaeseguirenelServiziocheasuavoltaaggiornaaltreproprietàdelmodelloeaggiornamenti(CRUD)anchealtrimodellinelservizio.

Idueapprocciacuihopensato,

  1. Ilmodellohariferimentoalservizio.Lachiamatadell'insiemediproprietàeseguel'operazionediservizio.Ma,nonpensochesiaunastrategiadiprogettazioneappropriataperfarlo,qualisonoipensierisuquesto?

    classModel{publicintProperty1{get=>_property1;set{_property1=value;Service.PerformOperation();OnPropertyChanged();}}}
  2. IlserviziosiiscriveaglieventideiModelli.

    classService{privatevoidModelPropertyChanged(objectsender,EventArgse){if(e.PropertyName=="Property1")
            {
                PerformOperation();
            }
        }
    }
    

Qual è la migliore strategia di progettazione consigliata in questo tipo di scenari?

=========================
Basato sulla risposta [@Robert Harvey]

Introdurre un lavoratore modello di servizio tra il servizio e il modello e impostare le proprietà del modello tramite il lavoratore modello di servizio. Ciò garantisce l'accoppiamento lento e mantiene il modello meno Anemico .

class Model
{
    public Model(IServiceWorker serviceWorker)
    {
    }

    public int Property1
    {
        get => _property1;
        set
        {
            _serviceWorker.SetProperty(
                nameof(Property1),
                value,
                () => { _property1 = value; });
        }
    }
}

class ServiceWorker : IServiceWorker
{
    public void SetProperty(string propertyName, object value, Action setPropertyInternal)
    {
        switch (propertyName)
        {
            case nameof(_model.Property1):
                {
                    //preview property change 
                    //(validation and other cancellable checks)
                    IModelValidator.Validate(propertyName, value);

                    //Before property changed
                    Service.PerformOperation_BeforePropertyChanged();

                    //Set property
                    setPropertyInternal();

                    //On Property change
                    Service.PerformOperation();

                    _model.RaisePropertyChanged(propertyName);
                }
                break;
        }
    }
}
    
posta A Bittersweet Life 27.09.2017 - 16:40
fonte

2 risposte

1

Se è necessario l'accoppiamento più flessibile possibile, aggiungi semplicemente una classe tra il Modello e il Servizio che sottoscrive gli eventi sul Modello, prende un riferimento al Servizio ed esegue le operazioni aziendali necessarie sul Servizio in base al Modello eventi licenziati.

    
risposta data 27.09.2017 - 16:46
fonte
1

Secondo lo schema ModelView-ViewModel, non ci dovrebbe essere questa freccia tra la tua vista e il modello.

La vista è solo il riflesso del tuo ViewModel. Il tuo ViewModel deve controllare tutte le cose. Esempio: hai detto che "le modifiche nel Modello devono causare ...", ma con MVVM e il collegamento dati, dovresti prima avere le modifiche gestite da ViewModel. Quindi, viewModel decide cosa fare, ovvero: (i) chiamare il servizio; (ii) aggiornare il / i Modello / i in modo appropriato.

Per favore, guarda lo schema da: link

In altre parole:

  • Gestisci gli input dell'utente sul tuo ViewModel;
  • A seconda della variabile modificata, chiama il servizio;
  • (opzionale) esegui l'elaborazione includendolo con BackgroundWorker per farlo in modo asincrono;
  • Al termine, aggiorna il modello di conseguenza;
  • ("opzionale") questa elaborazione viene eseguita utilizzando l'approccio ICommand, in modo da poter simulare e testare l'unità viewModel per verificare se tutte le informazioni sono state aggiornate in modo appropriato.
risposta data 28.09.2017 - 22:33
fonte

Leggi altre domande sui tag