저는 다양한 파일의 데이터를 읽고 공통 데이터베이스 테이블에 저장하는 프로그램을 작성했습니다. 파일의 데이터 형식은 데이터 원본에 따라 달라 지므로 각 파일이 고유합니다. 데이터 소스의 이름을 기반으로 파일 판독기를 결정할 방법이 필요하며 추상적 인 공장을 갖추고 있어도 switch-case 문을 피하는 데 문제가 있습니다. 나는 IFileReader
을 주입 할 수 있다는 것을 알고 있지만 스위치 케이스를 한 수준 위로 밀어 넣을뿐입니다.스위치 케이스가없는 클래스 만들기
다음은 현재 구현 된 예제입니다. switch-case 문을 완전히 제거하고 파일 판독기를 동적으로 결정하는 방법은 무엇입니까?
public class FileProcessor
{
private readonly IFileReaderFactory _fileReaderFactory;
private readonly FooDbContext _fooDb;
public FileProcessor(IFileReaderFactory fileReaderFactory, FooDbContext fooDb)
{
_fileReaderFactory = fileReaderFactory;
_fooDb = fooDb;
}
public void ProcessFile(string source, string filePath)
{
IFileReader fileReader;
switch (source)
{
case "A":
fileReader = _fileReaderFactory.CreateReader<FileReaderA>();
break;
case "B":
fileReader = _fileReaderFactory.CreateReader<FileReaderB>();
break;
default:
throw new Exception($"Unknown source: {source}");
}
_fooDb.Foos.AddRange(fileReader.ReadFile(filePath));
_fooDb.SaveChanges();
}
}
public interface IFileReaderFactory
{
IFileReader CreateReader<T>() where T : IFileReader, new();
}
public class FileReaderFactory : IFileReaderFactory
{
public IFileReader CreateReader<T>() where T : IFileReader, new()
{
return new T();
}
}
public interface IFileReader
{
List<Foo> ReadFile(string filePath);
}
public class FileReaderA : IFileReader
{
public List<Foo> ReadFile(string filePath)
{
// read file a
return new List<Foo>();
}
}
public class FileReaderB : IFileReader
{
public List<Foo> ReadFile(string filePath)
{
// read file b
return new List<Foo>();
}
}
이것은 반사를 사용하여 달성 할 수 있습니다. http://stackoverflow.com/questions/232535/how-do-i-use-reflection-to-call-a-generic-method – jrobichaud
상태 패턴을 살펴볼 수 있습니다. http://www.codeproject.com/Articles/489136/UnderstandingplusandplusplusStateplusP를 구현합니다. 개인적으로 나는 대개 케이스 진술로 돌아가고있다. – Sam
여기에는 너무 많은 옵션이 있습니다. 당신은 약간의 연구를하고 질문을 좁힐 필요가 있습니다. 스택 오버플로는 이미 일부 입력 매개 변수 (예 : 대리자 사전)를 기반으로하는 일련의 작업에서 선택하거나 동적 매개 변수화 된 유형의 제네릭 메소드를 호출하는 광범위한 작업 (많은 옵션 중 두 가지만 포함)에 대한 질문과 대답으로 가득차 있습니다 이 경우 귀하에게 제공됩니다. –