2010-01-21 5 views
0

저는 ElephantInputs, ElephantResults, GiraffeInputs, GiraffeResults, GorillaInputs, GorillaResults라는 입력 및 결과 테이블이 각각있는 여러 개의 데이터베이스 (Elephants, Giraffes, Gorillas 등)가 있습니다. 나는 테이블 명명을 제어 할 수 없다.LINQ to SQL 공분산 -이 작업을 수행하는 올바른 방법입니까?

저는 LINQ to SQL을 사용하여 ElephantInputs, ElephantResults, GiraffeInputs, GiraffeResults 등의 클래스를 자동으로 생성하고 있습니다.

이러한 데이터베이스에서 입력을 읽고 처리 할 수있는 단일 클래스 인 Processor()를 작성하고 싶습니다. 나는 사용자의 선택에 따라 프로세서를 인스턴스화하는 Factory 메소드를 가지고있다.

내가 한 첫 번째 작업은 입력 및 결과 개체에 대한 인터페이스와 각 데이터베이스에 대한 부분 클래스를 만들어 입력 및 결과 개체에서 해당 인터페이스를 구현하는 것입니다. 그것은 나에게 각 동물에 대한 공통적 인 인터페이스를 주었다. 또한 데이터베이스에서 항목을 반환하는 몇 가지 메서드가있는 각 데이터베이스에 대한 리포지토리 클래스를 만들었습니다.

public interface IBaseInput 
{ 
    int ID { get; set; } 
    string InputA { get; set; } 
    int InputB { get; set; } 
    double InputC { get; set; } 
} 

public interface IBaseResult 
{ 
    int ID { get; set; } 
    string ResultA { get; set; } 
    int ResultB { get; set; } 
    double ResultC { get; set; } 
} 

public interface IRepository<I, R> 
    where I : IBaseInput 
    where R : IBaseResult 
{ 
    IQueryable<I> GetInputs(); 
    IQueryable<R> GetResults(); 
} 

public partial class GorillaInput : IBaseInput 
{ 
} 

public partial class GorillaResult : IBaseResult 
{ 
} 

    // A concrete repository for Gorillas 
    public class GorillaRepository : IRepository<GorillaInput, GorillaResult> 
    { 

    GorillaDataContext db = new GorillaDataContext(GetConnectionString("Gorillas")); 

    public IQueryable<GorillaInput> GetInputs() 
    { 
     return from p in db.GorillaInputs select p; 
    } 

    public IQueryable<GorillaResult> GetResults() 
    { 
     return from r in db.GorillaResults select r; 
    } 
} 

다음, 내 프로세서

public interface IProcessor 
{ 
    void Process(); 
} 

여기에 구체적인 프로세서가, 그리고 그것을 만드는 공장을위한 인터페이스를 만들었습니다.

class Program 
{ 
    public static void Main() 
    { 
     IProcessor processor = ProcessorFactory.GetProcessor("Gorilla"); 
     processor.Process(); 
    } 
} 

나는이 권리를하고 있는가 :

public class Processor<T, I, R> : IProcessor 
    where T : class, IRepository<I, R>, new() 
    where P : IBaseInput 
    where R : IBaseResult 
{ 

    public void Process() 
    { 
     // Do some stuff ... 

     T repository = new T(); // Get results from the rater tables 
     IEnumerable<I> inputs = repository.GetInputs(); 
     IEnumerable<R> results = repository.GetResults(); 

     // Do some stuff with inputs and outputs... 
    } 
} 

public static class ProcessorFactory 
{ 
    public static IProcessor GetProcessor(string animal) 
    { 
     switch (animal) { 
      case "Elephant": 
       return new Processor<ElephantRepository, ElephantInput, ElephantResult>(); 
      case "Giraffe": 
       return new Processor<GiraffeRepository, GiraffeInput, GiraffeResult>(); 
      case "Gorilla": 
       return new Processor<GorillaRepository, GorillaInput, GorillaResult>(); 
      default: 
       return null; 
     } 
    } 
} 

마지막으로, 여기에 프로세서를 호출하는 프로그램입니까? 덜 복잡한 방법이 있습니까? 감사합니다.

답변

2

인터페이스를 구현하는 모든 구체적인 유형을 사용하는 이유는 무엇입니까?

public class Processor 
{ 

    public void Process(IRepository repository) 
    { 
     // Do some stuff ... 

     IEnumerable<IBaseInput> inputs = repository.GetInputs(); 
     IEnumerable<IBaseResult> results = repository.GetResults(); 

     // Do some stuff with inputs and outputs... 
    } 
}