Rappresentazione grafica di oggetti senza richiamare la logica di dominio

0

Non sono sicuro di come implementare un determinato aspetto dei miei oggetti.

Dato una classe modello che rappresenta un oggetto, con funzionalità di business basate su vari eventi, come possiamo rappresentare graficamente l'oggetto senza richiamare quegli eventi?

Modello di base

public class MyObject
{
    ObservableCollection<RelatedEntity> RelatedEntities { get; set; }

    public string Property1 { get; set; }
    public string Property2 { get; set; }

    public MyObject() {
        RelatedEntities.CollectionChanged += RelatedEntities_CollectionChanged;
    }

    private void RelatedEntities_CollectionChanged(object sender, System.Collections.Specialized.NotifyCollectionChangedEventArgs e) {
        // do business logic stuff here based on change in collection
    }
}

public class RelatedEntity
{
    public string Property1 { get; set; }
    public string Property2 { get; set; }
}

Ora avrò un provider che riempirà un'istanza di MyObject così posso usarlo:

    public static MyObject GetMyObject() {

        MyObject mine = new MyObject();

        // fill properties, including related entities

        return mine;
    }

Il problema qui è che il provider sta per far sì che la logica aziendale venga invocata mentre illustra la mia istanza, ma non è proprio quello che voglio. Voglio solo ottenere un'istanza completa senza agire come dovrebbe ...

Ho preso in considerazione l'inserimento di un flag di inizializzazione, qualcosa del genere:

public class MyObject
{
    ObservableCollection<RelatedEntity> RelatedEntities { get; set; }

    bool _initializing = false;

    public string Property1 { get; set; }
    public string Property2 { get; set; }

    public MyObject(IProvider provider) {

        RelatedEntities.CollectionChanged += RelatedEntities_CollectionChanged;

        _initializing = true;
        provider.FillObject(this);
        _initializing = false;

    }

    private void RelatedEntities_CollectionChanged(object sender, System.Collections.Specialized.NotifyCollectionChangedEventArgs e) {
        if (_initializing) return;
        // do business logic stuff here based on change in collection
    }
}

(ok, quindi quanto sopra è un pessimo esempio, dato che potrei facilmente spostare la sottoscrizione dell'evento sotto la routine di inizializzazione ... ma a un livello molto più generale, c'è una logica di business che potrebbe / verrebbe applicata in tutto il modello classe.

Operare in questo modo con una sorta di flag di inizializzazione diventa di molto lavoro.

Un altro approccio che ho provato a fare è guidare la logica del business attraverso metodi specifici:

public class MyObject
{
    public ReadOnlyCollection<RelatedEntity> RelatedEntities { get; private set; }  

    public string Property1 { get; set; }
    public string Property2 { get; set; }

    public void AddRelatedEntity(RelatedEntity entity) {
        // add to collection
        // invoke business logic
        // instance graphing would not call on this
    }

}

(anche in questo caso, forse non è l'esempio migliore ma ottiene il punto attraverso)

Tuttavia, questo è altrettanto disordinato e toglie severamente dall'usabilità naturale / semantica del modello come rappresentazione della logica aziendale.

Qualche consiglio sul modo migliore per gestire questi tipi di scenari?

    
posta jleach 25.02.2016 - 19:12
fonte

0 risposte

Leggi altre domande sui tag