Patterns & Co

di Stefano Mostarda, in .NET,

Sto riprendendo la mia prima applicazione scritta in .NET ormai 3 anni fa e la sto riscrivendo da capo cercando di sfruttare tutte le conoscenze che, in questo eterno (tecnologicamente parlando) periodo, ho appreso.
Trattandosi di un'applicazione non molto complessa (un piccolo Bug Tracker) ho deciso di optare per un DomainModel pattern che sfrutta un Table Data Gateway pattern. All'inizio avevo deciso di mettere Business Logic e Domain Model nello stesso assembly, ma poi ho deciso di separere il tutto. Per prendere confidenza con un pattern in più ho pensato di utilizzare il Lazy Load pattern nella sua forma più semplice (Lazy initialization) caricando le collection figlie legate alla mia classe solo quando richieste dall'applicazione. Qui è scattato il problema. Finchè ho tenuto tutto in un assembly, bastava richiamare all'interno del DomainModel i metodi per caricare la collection quando necessario.

public AlertCollection Alerts{
  get { 
    if (_alerts == null) LoadAlertsByUserId(_userId);
    return _alerts();
  }
}


La cosa non mi piaceva perchè c'era una dipendenza ciclica tra DomainModel e Business Logic.

A questo punto l'unica soluzione che mi si è presentata davanti è stata quella di pubblicare un evento nel DomainModel e scatenarlo quando la collection è ancora nulla. Nello strato di Business appena si crea l'oggetto, viene effettuata la sottoscrizione all'evento caricando la collection nel momento in cui questo viene scatenato.

Il DomainModel cambia così:

public EventHandler AlertsLazyLoad;

public AlertCollection Alerts{
  get { 
    if (_alerts == null){
      _alerts = new AlertsCollection();
      if (AlertsLazyLoad != null) AlertsLazyLoad(this, EventArgs.Empty)
    }
  }
  set { ... }
}

Lo strato di Business:
...
user.AlertsLazyLoad += new System.EventHandler(this.OnAlertsLazyLoad);
...
private void OnAlertsLazyLoad(object sender, EventArgs e){
 
  ((DomainModel.User)sender).Alerts = GetAlertsByUserId(((DomainModel)sender).UserId);
}

Forse non è la soluzine migliore anche perchè bisogna ricordarsi sempre di "abbonarsi" all'evento, ma preferisco un pò di codice in più, piuttosto che una dipendeza.

Stay Tuned...

Commenti

Visualizza/aggiungi commenti

| Condividi su: Twitter, Facebook, LinkedIn

Per inserire un commento, devi avere un account.

Fai il login e torna a questa pagina, oppure registrati alla nostra community.

Nella stessa categoria
I più letti del mese