Aggiungo funzionalità al nostro sito Web che esegue processi a esecuzione prolungata in modo asincrono utilizzando MSMQ. In questo modo, tuttavia, è necessario informare gli utenti quando le loro richieste sono state completate. Usando il pattern di comando, ho creato un'interfaccia * chiamata INotify e l'ho composta nella classe message, quindi la classe di elaborazione dei messaggi può semplicemente chiamare GiveNotice () sull'oggetto INotify del messaggio. La prima implementazione, EmailNotify, è stata più difficile del previsto, poiché sono stato sorpreso di scoprire che MailMessage non è serializzabile, ma ha funzionato.
Ora sto lavorando su un nuovo notificatore concreto, DBNotify, che chiamerà un SP di qualche tipo e aggiornerà uno stato nel database transazionale principale. Sono inciampato nel fatto che vorrei riutilizzare l'architettura DAL che abbiamo già creato, ma INotify è un membro del progetto Model, che è più fondamentale del DAL.
La nostra gerarchia è simile a questa: Common > Modello > DAL > BAL
Ecco ulteriori dettagli sui nostri particolari livelli. Tieni presente che l'ho ereditato, quindi non sto cercando suggerimenti per migliorarlo; Mi sto chiedendo come "infrangere le regole".
Common è responsabile di tutte le funzioni di "utilità" utilizzate in molti punti dell'applicazione, ad esempio l'accesso alle impostazioni di configurazione, le stringhe di analisi e le funzionalità non correlate al business.
Model è il repository di oggetti business, quello che alcuni chiamano oggetti di trasferimento dati, raccolte di getter e setter. Ho aggiunto alcune "intelligenze" a questo livello, ma solo le regole aziendali interne a quell'oggetto, ad esempio "Il nome di un articolo deve iniziare con un carattere alfanumerico."
DAL è il livello di accesso ai dati, in teoria, tutto ciò che accade qui è che gli oggetti del modello vengono spostati dentro e fuori dal database.
BAL è il livello aziendale; incapsula le regole aziendali che regolano l'interazione degli oggetti (ad esempio "Un modulo deve avere almeno due elementi.").
Quindi l'interfaccia di INotify è definita un'astrazione per consentire al metodo di notifica di variare in modo indipendente (ad esempio e-mail, TXT, twitter, ecc.) dall'elaborazione del messaggio. L'ho creato al livello Model, che è indipendente dal livello DAL, quindi non posso riutilizzare quel codice senza creare una dipendenza circolare.
Qualcun altro ha avuto a che fare con un oggetto business il cui scopo è interagire con un database, e come lo collochi nell'architettura N-tier?
Prima di dirmi di usare Linq per Sql, grazie mille. Questa non è una domanda tecnica (come faccio a farlo), è una domanda di design (come dovrei farlo).
Penso che la risposta sia l'iniezione di dipendenza, ma non l'ho mai usata.