Collegamento di un Business Layer e di un repository usando Unit of Work Pattern

8

La mia domanda è simile a questa su Stack Overflow: Qual è il modo corretto di utilizzare l'unità di lavoro / repository all'interno del livello aziendale?

Scenario:

  • .Net solution
  • IRepository utilizzato per recuperare oggetti dal DB
  • IUnitOfWork utilizzato per consentire transazioni su più repository

Questo ha senso per me e ho implementato qualcosa in questo senso che funziona bene. Ora voglio introdurre un livello di business logic e sto avendo problemi a organizzare i tre elementi (BLL, UnitOfWork e Repository) nella mia mente.

Comprensione:

  • Repository - recupero dei dati, manipolazione
  • UnitOfWork - persistenza
  • BLL - logica rilevante per il business ('mondo reale') (non mi piace quel termine!)

Considera che abbiamo un front-end MVC ASP.Net.

Che aspetto ha un BLL e che aspetto ha il controller MVC che lo usa?

Per riferimento: Mi chiedo se forse la mia implementazione di IUnitOfWork / IRepository potrebbe essere la causa alla base della mia confusione.

public class IRepository<T> 
{
    private IObjectSet<T> objSet;
    public IRepository<T>(IUnitOfWork uow)
    {
        objSet = uow.CreateObjectSet<T>();
    }

    public IQueryable<T> Add(T entity)
    {
        objSet.Add(entity);
    }
    //etc. etc. for delete, attach, getall
}

Quindi mi sento come se avessi un BLL, dovrei passarlo a IUnitOfWork, in modo che possa usarlo per creare le istanze IRepository di cui ha bisogno. Ma in che modo il BLL (DLL separata dal front-end) 'sa' quale implementazione di IRepository creare?

    
posta glosrob 28.09.2011 - 00:18
fonte

1 risposta

5

Si noti che ho solo una piccola esperienza con il framework .NET e che questa risposta si riferisce solo alla parte di architettura della tua domanda.

Per quanto ho capito, stai praticamente applicando i seguenti modelli architettonici nella tua applicazione:

Livelli: sembra che tu abbia un livello di persistenza (modello di repository), un livello di business logic e un livello di visualizzazione.

Model-View-Controller: questo modello viene applicato nel livello di vista utilizzando ASP.NET MVC.

I guess the question is: what does a BLL look like and what does the MVC controller that uses it look like?

Prima di tutto, questa architettura è pensata per applicazioni aziendali su larga scala come ha detto Robert Harvey nel suo commento alla tua domanda. Ciò che è caratteristico di tali sistemi è che la logica di dominio (che è stata incapsulata nel livello della logica aziendale) dovrebbe essere accessibile attraverso varie interfacce.

Considera Twitter ad esempio - Twitter potrebbe avere un livello di logica aziendale che fornisce servizi per la registrazione e la convalida degli utenti, la pubblicazione di tweet e molto altro. Oltre a questo livello di business logic, potrebbero esistere più altri componenti nel livello di visualizzazione, ad es. un'interfaccia web e un componente del servizio web. Poiché tutta la logica aziendale è incapsulata nel livello della business logic, è possibile seguire il principio DRY e migliorare la manutenibilità e altri attributi di qualità.

Per tornare alla tua domanda, dovresti incapsulare la logica aziendale e l'accesso ai dati nella BLL. Il controller (pensa MVC) dovrebbe fare uso della BLL e non dovrebbe avere accesso diretto al database. Considera il livello di visualizzazione come un'interfaccia per la tua applicazione.

So I feel like if I have a BLL, I should be passing it the IUnitOfWork, so that it can use that to create the IRepository instances that it needs. But how will the BLL (separate DLL from the front end) 'know' what implementation of IRepository to build?

La BLL dovrebbe sapere quale repository (origine dati?) usa. Gli strati sopra non dovrebbero controllarlo. Ancora una volta, considera il livello di visualizzazione solo come un'interfaccia alla tua logica aziendale.

Se non hai bisogno del sovraccarico di un livello di business logic, puoi anche scegliere di usarlo esclusivamente per l'accesso ai dati in forma di oggetti di accesso ai dati .

Spero che ciò abbia aiutato a chiarire le responsabilità dei vari componenti.

    
risposta data 21.10.2011 - 22:28
fonte