2013-02-21 3 views
0

현재 새 응용 프로그램에 대한 데이터 액세스 계층 및 비즈니스 논리 계층 클래스를 작성하고 있으며 (분명히) 질문이 있습니다.일반 DAL/BLL 클래스

  • 각 "층"다른 클래스 라이브러리와 네임 스페이스 (즉 App.Model, App.DAL에서 분리 모델 클래스와 데이터 액세스에 대한 엔티티 프레임 워크 사용 5 : 첫째, 여기에 도움이 될 몇 가지 세부 사항은 , App.BLL)

DAL로 시작 - 모든 DAL 클래스가 상속하도록 기본 클래스를 작성하기로 결정했습니다.

public abstract class DALBase<T> : IDisposable 
{ 
    protected AppEntities context; 
    protected DbSet set; 

    public DALBase() 
    { 
     context = new OECCORPEntities(); 
     set = context.Set(typeof(T)); 
    } 

    protected virtual void Save() 
    { 
     context.SaveChanges(); 
    } 

    public virtual void Add(T model) 
    { 
     set.Add(model); 
     Save(); 
    } 

    public virtual T Get(int id) 
    { 
     return (T)set.Find(id); 
    } 

    public virtual List<T> GetAll() 
    { 
     return set.OfType<T>().ToList(); 
    } 

    public virtual void Delete(int id) 
    { 
     T obj = Get(id); 
     set.Remove(obj); 
     Save(); 
    } 

    public virtual void Update() 
    { 
     Save(); 
    } 

    public void Dispose() 
    { 
     context.Dispose(); 
    } 
} 

기본 클래스는 DAL 클래스가 작업 할 모델의 유형이어야하는 제네릭 형식을 구현합니다. 제네릭 형식을 사용하여 생성자에서 아래의 미리 정의 된 CRUD와 같은 가상 함수 (add, get 등)에 사용되는 generic 인수의 형식을 사용하여 DbSet을 만듭니다.

그리고 나서 아이디어를 얻었습니다. 잠시만 기다려주세요 ... 일반적인 것이므로 모든 단일 모델에 대해 DAL 클래스를 구현할 필요가 없습니다. 다음과 같이 쓸 수 있습니다 :

public class GenericDAL<T> : DALBase<T> 
{ 
    public GenericDAL() : base() {} 
} 

... 어떤 모델에도 사용할 수 있습니다. OK, Business Logic Layer 등등. BLL에 대한 기본 클래스도 만들었습니다.

public abstract class BLLBase<T> 
{ 
    protected GenericDAL<T> dal; 

    public BLLBase() 
    { 
     dal = new GenericDAL<T>(); 
    } 

    public virtual void Add(T model) 
    { 
     dal.Add(model); 
    } 

    public virtual T Get(int id) 
    { 
     return dal.Get(id); 
    } 

    public virtual List<T> GetAll() 
    { 
     return dal.GetAll(); 
    } 

    public virtual void Delete(int id) 
    { 
     dal.Delete(id); 
    } 

    public virtual void Update() 
    { 
     dal.Update(); 
    } 
} 

... GenericDAL을 사용하여 작업을 수행합니다.

public class GenericBLL<T> : BLLBase<T> 
{ 
    public GenericBLL() : base() { } 
} 

그리고 그것을 테스트하는 간단한 콘솔 응용 프로그램 :

class Program 
{ 
    static void Main(string[] args) 
    { 
     GenericBLL<ADMIN> bll = new GenericBLL<ADMIN>(); 
     List<ADMIN> admins = bll.GetAll(); 
    } 
} 

... "ADMIN"는이다 그래서 시뮬 방식으로, 난 그냥 같이 보이는 GenericBLL 클래스를 썼다 모델 유형. 매력처럼 작동합니다.

추가 기능을 필요로하지 않는 한 모든 단일 모델에 대해 DAL/BLL 클래스를 작성하지 않아도되는 아이디어가 있습니다. 누군가가 왜 내가 라고 말하면이 이런 식으로하고 싶지 않겠습니까? 일반 DAL/BLL 클래스는 작업을 완료하고 개발 시간을 절약 할 수 있다고 생각합니다.

감사합니다.

답변

1

음, 하나의 단점은 나중에 일부 비즈니스 규칙을 추가하기로 결정하는 경우가 WhateverBLLGenericBLL [무엇이든]에서 유형을 전환해야 할 것입니다에 있다는 것입니다.

명백한 해결책은 GenericBLL [Whatever]으로부터 상속받은 클래스를 만드는 것입니다. 좋아요 :

public class WhateverBLL : GenericBLL<Whatever> 

대신이 클래스를 사용하십시오.

+0

오른쪽. 모델이 표준 crud 함수를 더 많이 필요로한다면,이를위한 특정 BLL 클래스를 구현할 것입니다. "모델"에 필요한 많은 기능은 매우 기본입니다. 따라서 일반적인 클래스가 많은 역할을합니다. – zday

+0

맨 처음부터 모든 엔터티에 대한 특정 BLL 클래스를 작성하는 것이 좋습니다. 그것들은 일반 기본 클래스에서 상속받은 스텁이어야합니다. 이렇게하면 이후에 비즈니스 논리를 추가하기로 결정한 경우 유형을 변경할 필요가 없습니다. –

+0

큰 제안 - 많은 의미가 있습니다. 고맙습니다! – zday

0

지금 당장 귀하의 BLL은 특별히 가치를 부여하지 않습니다. 모든 호출은 단순히 다른 계층에 대한 통과입니다. 어쩌면 응용 프로그램의 단순함 (그리고 행운의 별에 감사드립니다), 또는 다른 곳에서 실제 비즈니스 로직으로 분류 할 수있는 부분이있을 수도 있습니다.

저에게 비즈니스 로직은 데이터 지속성, 데이터 검색 후 완료되는 모든 사항 및 그와 같은 것들입니다. 결정, 도로의 포크, 취해진 조치. 실제 데이터 저장 및 검색은 일반적으로 비교하면 매우 간단합니다.

일반적인 DAL 기본 클래스를 살펴보면 훌륭한 시작이라고 생각합니다. 아마도 테스트 할 때 인터페이스를 대체 할 수 있도록 인터페이스를 추출 할 것입니다. 지금은 클래스가을 상속받은 클래스는 아무 값도 추가하지 않습니다. 단순히 레이어와 클래스를 만들지 말고, 그것이 가치를 더하고 어떤 식 으로든 삶을 편하게 해줄 수 있도록하십시오.

일반 BLL 클래스를 살펴보면 어떤 형태로든 코드 숨김에 또는 콘솔 응용 프로그램에서 클래스 파일 내에 실제 비즈니스 로직을 숨겨 놓은 것 같습니다. 유형에 따라 달라지는 일반적으로 적용 할 수있는 기능이있을 수도 있지만 하나의 클래스이 원하는 위치에 있다고 생각하지 않습니다. 여기 내 제안은 실제 비즈니스 논리라고 생각하는 것을 재검토하는 것입니다. DAL에 대한 간단한 패스 스루 (pass-through) 레이어가 아닐 수도 있습니다.

+0

아직 실제로 구현 된 실제 비즈니스 로직이 없습니다. 이것이 바로 프로젝트의 시작입니다. 이 패턴을 잘 알고 있기 때문에 BLL을 사용하는 응용 프로그램은 DAL을 인식하지 않아야합니다. 따라서 기본적인 기능은 현재 필요한 최소한의 기능입니다. 새로운 비즈니스 로직을 추가해야하는 경우 필요한 기능을 갖춘 해당 모델에 맞는 BLL 클래스를 작성합니다. 아이디어는 필자가 필요로 할 때마다 특정 클래스를 작성하는 것일 뿐이며 모든 단일 클래스를 작성하는 것이 아닙니다. 우리가 필요로하는 많은 것들은 실제로 일부 모델의 기본입니다. – zday