저는 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;
}
}
}
마지막으로, 여기에 프로세서를 호출하는 프로그램입니까? 덜 복잡한 방법이 있습니까? 감사합니다.