Simple. 귀하는 귀하의 질문에 방금 말씀하셨습니다.
당신은 해결하기 위해 두 가지 문제가 있습니다
- 가 소스에서 C#을 개체에
- 변환 XML 데이터를 XML 데이터를 가져
첫 번째 문제 구현하려면 : - IXmlDataGetter, 인터페이스를 원본에서 단일 XML 데이터 가져 오기
public interface IXmlDataGetter {
XmlData GetData(XmlDataName name);
}
"XMLDATA"이어야 어느 바이트 [] 또는 스트림 (XML 데이터의 인코딩에 관련하여 메타 데이터를 포함하기 때문에, I 그것이 바이트 레벨로 유지되어야한다고 생각) 또는 (a DOM 트리 일 등 XmlNode). 자신에게 가장 적합한 솔루션을 선택하십시오.
"XmlDataName"은 저장된 데이터를 식별하는 방법입니다. 데이터에는 이름이 있지만 복잡 할 수 있습니다. 그것은 단지 "PERSON"문자열 일 수도 있고, ID 인 정수 25 일 수도 있습니다. ID가 25 인 사람의 데이터 이름은 쌍 ("PERSON", 25) 일 수 있습니다.
이 인터페이스는, DB 구현 될 수
이
public class DBXmlDataGetter : IXmlDataGetter {
XmlData GetData(XmlDataName name) {
return ResultOfQuery("SELECT xml_text FROM " + name.first /* PERSON */ + " WHERE ID=" + name.second /* 25 */);
}
}
이 인터페이스는 또한 파일 구현 될 수
:
물론 "ResultOfQuery"와 "ContentsOfFile"의
public class FileXmlDataGetter : IXmlDataGetter {
XmlData GetData(XmlDataName name) {
return ContentsOfFile(name.first /* PERSON */ + "_" + name.second /* 25 */ + ".xml");
}
}
는 단지 이름입니다 내가 해결하도록 남겨 두는 것들. 웹의 경우 동일한 방식으로 XmlDataName에서 URL을 작성하십시오.
지금. 두 번째 문제는 XML을 C# 객체로 변환하는 것입니다. XMLDeserializer를 사용하거나 XMLReader로 데이터를 구문 분석하고 명시 적으로 객체를 빌드 할 수 있습니다. 당신은 테 작업을 수행하고 생성자 매개 변수로 적절한 전략을 취 클래스를 만들 수 있습니다
public class XmlPersonRepository {
private readonly IXmlDataGetter _getter;
public PersonFetcher(IXmlDataGetter getter) {
_getter = getter;
}
Person GetFromId(int id) {
var xmlData = _getter.GetData(new XmlDataName("PERSON", id));
return ConvertToPerson(xmlData);
}
}
여기 IOC의/의존성 주입의 철학적 질문에받지 않습니다, 그러나 이것은 기본 패턴입니다
. 변환을 수행하는 클래스는 변환 만 수행합니다. 끝에서 끝까지 유스 케이스를 수행하는 데 필요한 것은 위에서 "주입"됩니다.
당신은 책임을 분리 했으므로 원하는 경우 XML 데이터를 사용자 복사/붙여 넣기에서 텍스트 상자로 가져올 수 있습니다.
DEpendency injection은 당신의 친구입니다 !! – DarthVader
감사합니다. 도움이 되겠습니다. –