0

C#のリポジトリパターンについて読んだところです。これは、実際のデータにアクセスする方法について交換可能なレイヤーを提供します。それは素晴らしいことです。ただし、次の点を考慮してください。

ファイルからXMLデータをフェッチしてac#オブジェクト(Person.cs POCO)として返すXmlPersonRepositoryがあります。ここで、XMLデータの物理ソースも交換可能にする必要があります。元々はファイルから取得されますが、Webサーバーまたはリソース文字列から取得することもできます。これを最も再利用可能な方法で実装するにはどうすればよいですか?XmlPersonFromFileRepositoryやXmlPersonFromWebRepositoryのようなものは、コードの重複を意味するため、書きたくありません。生のXMLデータをac#オブジェクトに変換するためのコードが複製されますが、ファイルまたはWebサービスからXMLをフェッチするかどうかに関係なく、このコードは同じままです。したがって、両方のクラスに変換コードを含めることは冗長です。

つまり、簡単に言うと、2つの抽象化レイヤーが必要です。1つは任意のソースから物理XMLデータをフェッチするレイヤーで、もう1つはこのデータをc#オブジェクトに変換するレイヤーです。両方とも交換可能である必要があります。

どうすればこれを実装できますか?そして、これが良い考えかどうか教えてください、私は正しい方向に進んでいますか?

4

2 に答える 2

1

単純。あなたはあなたの質問でそれを言いました。

解決すべき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データを自由にコピーしてテキストボックスに貼り付けることができます。

于 2013-02-14T12:48:40.707 に答える
0

前述のように、依存性注入/ Iocとは何かを確認し、そこにあるフレームワークのいくつか(Ninject、Autofacなど)を確認してください。一言で言えばIXmlPersonRepository、メソッドを定義するインターフェースを作成し、それを次のようなxmlを提供するすべての異なるクラスに実装する必要があります。

  • XmlFilePersonRepository:IXmlPersonRepository
  • XmlDBPersonRepository:IXmlPersonRepository

等々。

次に、インターフェイスIXmlPersonRepositoryを使用して呼び出しを行います。DIビットは、インターフェイスの具体的な実装を担当し、db、fileなどの間で簡単に交換できます。

于 2013-02-14T12:02:07.803 に答える