単純。あなたはあなたの質問でそれを言いました。
解決すべき2つの問題があります。
- ソースからXMLデータを取得する
- XMLデータをC#オブジェクトに変換する
最初の問題を実装するには:-IXmlDataGetter、ソースから単一のXMLデータを取得するインターフェース。
public interface IXmlDataGetter {
XmlData GetData(XmlDataName name);
}
「XmlData」は、byte []またはStream(XMLにはデータのエンコードに関するメタデータが含まれているため、バイトレベルで保持する必要があると思います)またはDOMツリー(XmlNodeなど)のいずれかである必要があります。自分に最適なソリューションを選択します。
「XmlDataName」は、保存されているデータを識別する方法です。データには名前がありますが、複雑な場合もあります。これは、文字列「PERSON」と整数25で、IDである可能性があります。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 */);
}
}
このインターフェイスは、ファイルに実装することもできます。
public class FileXmlDataGetter : IXmlDataGetter {
XmlData GetData(XmlDataName name) {
return ContentsOfFile(name.first /* PERSON */ + "_" + name.second /* 25 */ + ".xml");
}
}
もちろん、「ResultOfQuery」と「ContentsOfFile」は、私が解決するためにあなたに任せているものの単なる名前です。また、Webの場合も、同じ方法でXmlDataNameからURLを作成します。
今。2番目の問題は、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データを自由にコピーしてテキストボックスに貼り付けることができます。