2011-02-08 4 views
4

Nous passons d'ASP.NET Web Forms à MVC 2.0. Dans la plupart de nos projets, nous avons une configuration typique pour communiquer avec une base de données.ASP.NET MVC: conception BLL et DAL vers le référentiel

commune (objets/entités comme 'MenuSite' et 'utilisateurs')

couche logique métier (avec des appels à de données de la couche d'accès)

d'accès aux données couche

Le DAL a un DatabaseHelper avec une opération de base de données commune, un OdbcHelper avec des opérations spécifiques à la base de données (par exemple MySQL) et une classe StoredProcedure avec toutes les procédures stockées.

Comment cette conception est-elle traduite dans une conception de référentiel? Nous voulons utiliser nos propres assistants de base de données au lieu de NHibernate etc.

Que suggéreriez-vous?

Répondre

1

Vous pouvez conserver la même approche en couches lors du passage à MVC. Votre BLL qui renvoie des entités/objets peut être votre M dans MVC. Souvent, vous verrez dans les exemples où les gens créent une instance du dépôt directement dans leur contrôleur, dans votre cas, vous allez créer une instance de votre classe BLL.

+0

Nous utilisons des entités/objets dans les M (modèles) quand nous voulons les exposer à une vue. Sinon, nous les avons maintenant placés dans une bibliothèque de classes Domain séparée. Mais comment utiliser le design du dépôt? Et où mettre les appels de base de données (génériques et spécifiques à la base de données)? Peut-être que c'est juste une chose à nommer, mais toutes les pensées sont les bienvenues! – jpderooy

+0

Un référentiel n'est rien de plus qu'un tour différent sur vos classes DAL qui utilisent la technologie de base de données que vous utilisez. Je ne veux pas entrer dans les détails de la façon dont le référentiel est différent de vos classes DAL, c'est une requête google facile à faire. Cependant, en essence, ils servent à des fins similaires. Sinon, vous créeriez toujours une instance de votre classe BLL dans votre contrôleur, ce qui créerait une instance du référentiel, renvoyant éventuellement l'entité jusqu'à l'utiliser comme M dans MVC. – e36M3

+0

Salut, cela a du sens. Je pense que la différence ou la similarité DAL du dépôt <> n'est pas claire (même à travers une recherche google). Pouvez-vous me donner plus d'informations sur la configuration? Entités, Business Logic et un référentiel qui communique avec la base de données? Où - dans une structure et un nom de dossier logique - devons-nous mettre les opérations spécifiques à la base de données comme db.run() par exemple? Merci! – jpderooy

3

Vous pouvez utiliser des référentiels en utilisant chaque technologie d'accès aux données. Un référentiel est une abstraction par rapport aux assistants/services d'accès aux données existants, permettant le découplage de la logique métier de la couche d'accès aux données. Référentiels utilisés avec Query pour activer le filtrage. Il est souvent utilisé avec unité de travail pour stocker les modifications dans la base de données.

Un dépôt comporte au moins:

  1. Get-objet par clé opération (s)
  2. Get-all-Objets
  3. Get-premier-objet par requête opération (s)
  4. opération par requête Get-objets (s)

Un exemple très simple :):

A. Produit classe, défini dans commun:

public class Product 
{ 
    public int Id { get; private set; } 

    public string Code { get; set; } 

    public string Name { get; set; } 

    public decimal Price { get; set; } 
} 

B. Classes pour Recherche, IRepository et IUnitOfWork sont définis dans DAL.interfaces.dll ou commun .dll (mais PAS dans DAL!).

public class Query 
{ 
    public string Text { get; set; } 
} 

public interface IRepository<TEntity> 
    where TEntity : class 
{ 
    bool TryGet(int key, out TEntity value); 

    TEntity this[int key] { get; } 

    IEnumerable<TEntity> GetAll(); 

    bool TryGetFirst(Query condition, out TEntity value); 

    TEntity GetFirst(Query condition); 

    IEnumerable<TEntity> GetAll(Query condition); 

    int Count { get; } 
} 


public interface IUnitOfWork 
{ 
    void SetAdded(TEntity value); // Marks entity as added for further INSERT 

    void SetRemoved(TEntity value); // Marks entity as removed for further DELETE 

    void SetChanged(TEntity value); // Marks entity as modified for further UPDATE 

    void Save(); // Save all the changes 
} 

IUnitOfWork est au courant des entités modifiées.Save() appelle une méthode CRUD DatabaseHelper/OdbcHelper appropriée pour chaque entité modifiée afin de conserver les modifications dans la base de données.

La mise en œuvre de IRepository <Produit> ... IRepository <EntityXY> et IUnitOFWork doit être placé dans DAL. Le BLL utilise ensuite IRepository et IUnitOFWork afin de mettre en œuvre la logique métier (domaine). Le BLL lui-même pourrait être organisé comme couche de service sur le dessus de domaine modèle, mais il est hors de la portée de la discussion :).

J'espère que ma réponse sera utile.

S'il vous plaît ne hésitez pas à me poser une question ...

Liens: Patterns of enterpise application architecture by Martin Fowler

+0

Très bonne explication. –

Questions connexes