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,
Ilmodellohariferimentoalservizio.Lachiamatadell'insiemediproprietàeseguel'operazionediservizio.Ma,nonpensochesiaunastrategiadiprogettazioneappropriataperfarlo,qualisonoipensierisuquesto?
classModel{publicintProperty1{get=>_property1;set{_property1=value;Service.PerformOperation();OnPropertyChanged();}}}
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;
}
}
}