2011-02-08 3 views
4

ASP.NET 웹 양식에서 MVC 2.0으로 이동합니다. 대부분의 프로젝트에서 데이터베이스와 통신하기위한 일반적인 설정이 있습니다.ASP.NET MVC : BLL 및 DAL을 리포지토리 디자인에

공통 (개체/'SiteMenu'와 '사용자'와 같은 단체)

비즈니스 로직 계층

데이터 액세스 레이어 (데이터를 해제하기 위해 호출 액세스 레이어와)

DAL에는 일반적인 데이터베이스 작업을 수행하는 DatabaseHelper와 데이터베이스 관련 작업 (예 : MySQL)이있는 OdbcHelper 및 모든 저장 프로 시저가 포함 된 StoredProcedure 클래스가 있습니다.

이 디자인은 어떻게 저장소 디자인으로 변환됩니까? 우리는 NHibernate 대신에 우리 자신의 데이터베이스 헬퍼를 사용하고 싶다.

당신은 무엇을 제안하겠습니까?

답변

1

MVC로 이동할 때 동일한 계층화 된 접근 방식을 유지할 수 있습니다. 엔터티/개체를 반환하는 BLL은 MVC에서 M이 될 수 있습니다. 종종 컨트롤러에서 리포지토리의 인스턴스를 직접 만드는 샘플을 볼 수 있습니다. 사용자의 경우 BLL 클래스의 인스턴스를 만들 수 있습니다.

+0

우리는 M (모델)에서 엔티티/객체를 사용합니다. 그렇지 않으면 별도의 Domain 클래스 라이브러리에 넣게됩니다. 그러나 저장소 디자인을 사용하는 방법은 무엇입니까? 그리고 어디 데이터베이스 호출 (일반 및 데이터베이스 관련)를 넣어? 어쩌면 그것의 다만 명명 이름, 그러나 약간 생각은 환영 받다! – jpderooy

+0

저장소는 사용하는 데이터베이스 기술을 사용하는 DAL 클래스의 다른 스핀 일뿐입니다. 리포지토리가 DAL 클래스와 다른 점에 대해 자세히 설명하고 싶지는 않습니다. 쉽게 작성할 수있는 Google 쿼리입니다. 그러나 본질적으로 그들은 비슷한 목적을 가지고 있습니다. 그렇지 않으면 컨트롤러에서 BLL 클래스의 인스턴스를 만들고 리포지토리의 인스턴스를 만들어 결국 MVC에서 M으로 사용할 엔티티를 모두 반환합니다. – e36M3

+0

안녕하세요. 나는 리포지토리의 DAL 차이점이나 유사점이 (구글 검색을 통해서조차도) 명확하지 않다고 생각한다. 설정에 대한 정보를 좀 더 주시겠습니까? 엔터티, 비즈니스 로직 및 데이터베이스와 통신하는 저장소? 논리 폴더 구조와 이름에서 db.run()과 같은 데이터베이스 관련 작업을 어디에 넣을 까? 감사! – jpderooy

3

모든 데이터 액세스 기술을 사용하여 리포지토리를 활용할 수 있습니다. 저장소은 기존 데이터 액세스 도우미/서비스를 추상화 한 것으로 데이터 액세스 계층에서 비즈니스 논리를 분리 할 수 ​​있습니다. 리포지토리는 쿼리와 함께 필터링을 사용하기 위해 사용됩니다. 종종 작업 단위과 함께 사용하여 변경 사항을 다시 데이터베이스에 저장합니다.

리포지토리는이 적어도 :

  1. 가져 객체별로 키 조작 (들)
  2. 가 가져-모든-개체를 조작
  3. 가져 오기 최초의 객체 별 쿼리 작업 (S)
  4. 은 Get-개체별로 쿼리 작업 (들)

아주 간단한 예 :) :

A. 공통에 정의 제품 클래스 :

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

    public string Code { get; set; } 

    public string Name { get; set; } 

    public decimal Price { get; set; } 
} 
쿼리, IRepository 및 IUnitOfWork에 대한

B. 클래스는 DAL.interfaces.dll 또는 공통 에 정의되어 .dll (단 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는 변경 실체 알고 있습니다.Save()은 데이터베이스에 변경 사항을 유지하기 위해 변경된 모든 엔터티에 대해 적절한 DatabaseHelper/OdbcHelper CRUD 메소드를 호출합니다.

IRepository < 제품 > ... <EntityXY>IUnitOFWork IRepository의 구현은 DAL에 배치해야합니다. 그런 다음 BLL은 비즈니스 (도메인) 논리를 구현하기 위해 IRepositoryIUnitOFWork을 사용합니다. BLL 자체는 서비스 레이어도메인 모델의 맨 위에 구성 될 수 있지만 토론의 범위를 벗어납니다.

내 대답이 도움이 되길 바랍니다.

나에게 질문을 주시기 바랍니다 ...

링크 : 우리가보기에 노출하고자 할 때 Patterns of enterpise application architecture by Martin Fowler

+0

아주 좋은 설명. –