2015-01-31 1 views
2

최근에 나는 asp.net mvc와 함께 작업했으며 샘플 프로젝트에서 Database Factory 클래스를 사용하고있는 것으로 나타났습니다. 왜 내가 그것을 사용하는지 설명해 주시겠습니까?왜 asp.net mvc에서 데이터베이스 팩토리를 사용합니까?

IDatabaseFactory 클래스

public interface IDatabaseFactory : IDisposable 
{ 
    EFMVCDataContex Get(); 
} 

DatabaseFactory 클래스

public class DatabaseFactory : Disposable, IDatabaseFactory 
{ 
    private EFMVCDataContex dataContext; 
    public EFMVCDataContex Get() 
    { 
     return dataContext ?? (dataContext = new EFMVCDataContex()); 
    } 
    protected override void DisposeCore() 
    { 
     if (dataContext != null) 
      dataContext.Dispose(); 
    } 
} 

답변

1

이것은 Abstract Factory 설계 패턴의 일례이다. 아이디어는 클래스 간의 느슨한 결합을 제공하는 솔기를 만들어 다른 유형의 컨텍스트를 테스트 목적으로 또는 응용 프로그램을 확장하기 위해 바꿀 수있게하는 것입니다.

일반적으로 팩토리는 데이터베이스 연결과 같이 수명이 짧은 종속성을 관리하는 방법입니다. 일반적으로 프레임 워크는 팩토리 인스턴스를 삽입하는 방법을 제공하고 프레임 워크는 인터페이스 (이 경우 IDatabaseFactory)를 기반으로 프레임 워크와 프레임 워크 사용자 간의 계약으로 작업 할 수 있습니다. 이 서비스는 다음 공장에 의해 생성 된 상황보다 훨씬 긴 수명을 위해 인스턴스화 할 수

public interface ISomeService 
{ 
    void DoSomething(); 
} 

public class SomeService() 
{ 
    private readonly IDatabaseFactory factory; 

    // The factory is injected through the constructor 
    public SomeService(IDatabaseFactory factory) 
    { 
     this.factory = factory; 
    } 

    public void DoSomething() 
    { 
     using (EFMVCDataContex context = this.factory.Get()) 
     { 
      // Run a LINQ query here using the context 

     } // This bracket disposes the context 
    } 
} 

: 프레임 워크는 다음과 같은 형태 코드가됩니다. 더 중요한 것은 컨텍스트가 항상이 시나리오에서 적절히 처리된다는 것입니다. EFMVCDataContex, MyDatabaseFactory

public class MyDatabaseFactory : Disposable, IDatabaseFactory 
{ 
    private EFMVCDataContex dataContext; 
    public EFMVCDataContex Get() 
    { 
     return dataContext ?? (dataContext = new AlternateDataContext()); 
    } 

    protected override void DisposeCore() 
    { 
     if (dataContext != null) 
      dataContext.Dispose(); 
    } 
} 

AlternateDataContext이 상속 가정 (또는 구현을) :

지금,이 일의 주요 장점은 대체 구현 (일반적으로 Liskov Substitution Principle이라한다)으로 DatabaseFactory을 교환 할 수 있다는 것입니다 SomeService를 변경하지 않고도 DatabaseFactory로 apples-for-apples를 바꿀 수 있습니다.

MyDatabaseFactory는 생성자의 연결 문자열로 코딩되어 다른 데이터베이스에 연결할 수 있습니다.

물론 DoSomething 메서드를 테스트하는 데 사용할 수있는 IDatabaseFactory의 모의 구현을 만드는 것이 좋습니다. 단위 테스트에서는 SomeService (테스트중인 클래스)가 사용되는 유일한 실제 클래스 여야하며 IDatabaseFactory는 mock이어야합니다 (클래스를 손으로 코딩하거나 조롱 프레임 워크를 사용하여 수행 할 수 있음).

+0

감사합니다. @ NightOwl888 내게 정말 유용한 답변입니다. :) –

관련 문제