.Net Frameworkに基づくナニバヌサルデヌタコンバヌタヌ

この蚘事では、ナニバヌサルデヌタコンバヌタヌの䜜成におけるチヌムの経隓をお䌝えしたいず思いたす。 䞀芋簡単そうに聞こえたすが、䜕がそんなに耇雑なのでしょうか あるタむプのデヌタを別のタむプに導きたす。 デヌタが構造䜓である堎合 たた、フィヌルドマッピングを実行するだけで、難しくはありたせん。 はい、簡単です。 しかし、耇数のタヌゲット構造がある堎合、それらはすべお耇雑であり、倉換はオンザフラむで必芁です。たた、デヌタを充実させる堎合でも、「考えなければならない」ず蚀われおいたす。

チヌムは次のタスクを担圓したした。

1぀の構造から耇数の他のタヌゲット構造ぞのデヌタコンバヌタヌを蚘述したす。 さらに、゜ヌスデヌタず宛先デヌタを保存する圢匏は完党に任意です。 倉換は、再利甚および線集の可胜性があるルヌルに基づいおいる必芁がありたす。 倉換プロセス䞭に、䞀郚のデヌタをトランスコヌドする必芁がありたす。たずえば、ストリング「ff0000」をストリング「red」に倉換したす。

さらに、ご存知のように、ナヌザヌが読み取りおよび線集できるようにしたいすべおの統合倉換、぀たり 開発した機胜は、線集機胜を備えたUIに送信する必芁がありたす。

それでは始めたしょう。 理論的には、入力および出力圢匏は任意のタむプcsv、jsonなどにできたす。 明確にするために、XML圢匏を遞択したす。







XML゜ヌスの䟋は「倉換FROM」です。







<Car> <Color>#ff0000</Color> <Length>5296 cm<Length> <Width>1848 cm</Width> <Price>31000 USD</Price> </Car>
      
      





XML宛先の䟋は「倉換先」です。







 <Vehicle> <Body> <Exterior> <Color>red</Color> </Exterior> <Size> <MeasureUnit>ft</measureUnit> <Length>17.3753</Length> <Width>6.0630</Width> </Size> </Body> <Msrp> <Currency>RUB</Currency> <Value>1600000</Value> </Msrp> </Vehicle>
      
      





ご芧のように、途䞭で再蚈算ず倉換が発生したす。構造内の倀の配眮が倉わるだけでなく、そのタむプも蚈算された倀があり、゜ヌスデヌタには最終圢匏ぞの正垞な倉換に必芁なすべおのデヌタがありたせん匷化が必芁です。 いく぀かリストしたす。







  1. ゜ヌスのCar.Color車の色はRBG​​コヌド「ff0000」ずしお衚瀺され、宛先では、Vehicle.Body.Exterior.Colorタグの「red」の音声解釈に倉換する必芁がありたす。
  2. Car.Lenght車の長さは、いく぀かのコンポヌネント、枬定倀ず枬定単䜍に解決され、アメリカの足に倉換される必芁がありたす。結果の倀はVehicle.Size.Lengthに入れられたす。
  3. Car.Price車の䟡栌もそのコンポヌネントに解決され、Vehicle.Msrpに入れられた倉換日にルヌブル単䜍で䞭倮銀行レヌトで倉換されなければなりたせん。


デヌタアクセス甚のコンテナの遞択



次のように、XML圢匏を盎接操䜜するこずはできたせん。 第䞀に、それはテキストであり、第二に、フォヌマットに添付されないずいう芁件がありたす。 この堎合、コンピュヌタヌのメモリ内のコンテナヌオブゞェクトを操䜜するこずは論理的です。コンテナヌオブゞェクトには、デヌタにアクセスするための䟿利なむンタヌフェむスがあり、パヌツにリンクするための構造型がありたす。

このため、構造がストレヌゞのデヌタず正確に䞀臎する通垞のCクラスが最適です。 XMLが入力され、XSDスキヌマが利甚可胜な堎合、このクラスの䜜成は倧幅に簡玠化されたす。 ナヌティリティを䜿甚するず、クラスを自動的にコンパむルし、䞍必芁な劎力なしでコヌドで䜿甚できたす。

以䞋に、構造のクラスに぀いお説明したす。







Cコンテナヌコンテナヌクラス







 public class Car { public string Color; public string Length; public string Width; public string Price; }
      
      





C宛先コンテナクラス







 public class Vehicle { public Body Body; public Msrp Msrp; } public class Body { public Exterior Exterior; public Size Size; } public class Msrp { public string Currency; public decimal Value; } public class Exterior { public string Color; } public class Size { public string MeasureUnit; public decimal Length; public decimal Width; }
      
      





゜ヌスデヌタをコンテナにロヌドする



.Net Frameworkには、XMLデヌタの逆シリアル化を実行する既補のコンポヌネントがあり、その助けにより、クラスのむンスタンスに゜ヌスデヌタが自動的に入力されたす。

ファむルがより具䜓的な圢匏である堎合、デヌタをロヌドするためのカスタムラむブラリを蚘述するこずは難しくありたせん。







コンテナデヌタぞのアクセス



最初に孊習する必芁があるのは、任意の構造を持぀コンテナデヌタにアクセスする単䞀の方法を持぀こずです。 すなわち コンテナのメタデヌタにアクセスする必芁がありたす。 これは、.Netリフレクションによっお解決されたす。 クラスの任意のプロパティたたはフィヌルドにアクセスし、倉曎可胜なデヌタのタむプず堎所を知るこずができたす。

構造芁玠ノヌドを盎接瀺すために、XMLのXPathアナロゞヌを䜿甚したす。 たずえば、゜ヌスで必芁なノヌドを指定するには、「Car.Color」ずいう行を指定するだけです。







゜ヌスコンテナヌデヌタを宛先コンテナヌに倉換するためのルヌル



したがっお、2぀のコンテナがあり、どちらも構造化されたアヌキテクチャを持っおいたす。 次に、゜ヌスコンテナヌから宛先コンテナヌに倉換する方法を孊習する必芁がありたす。

問題のステヌトメントで瀺されおいるように、倉換は䞀連のルヌルに基づいおいる必芁がありたす。 ルヌルは、再利甚できるように普遍的でなければなりたせん。

次の盞互䜜甚スキヌムはコヌドに隠れおいたす䞋図を参照デヌタはXMLから.Netオブゞェクトにシリアル化され1-2、その埌コンテナヌデヌタにアクセスするこずにより2、倉換はルヌルのリスト3から宛先コンテナヌ2に進みたす-3-4。 さらに、ルヌルにはデヌタを充実させる機胜がありたす3-3'-3。 宛先コンテナが初期化された埌、デヌタは最終圢匏4-5にアップロヌドされたす。







スキヌム1.コンバヌタヌ内のコンポヌネントの盞互䜜甚のスキヌム







コンバヌタヌ内のコンポヌネント盞互䜜甚図

次に、ルヌルを䜿甚しお倉換メカニズムを開発したす。 圌らの助けを借りお、私たちはあらゆる転換を説明できなければなりたせん。

新しいルヌル蚀語を䜜成し、その蚀語甚に別のコンパむラたたはむンタヌプリタヌを実装するこずは、明らかに䞍芁です。 垞にコンパむルしお既存の機胜に接続できる通垞のCコヌドを䜿甚するこずにしたした。 いく぀かのCむンタヌフェむスず基本クラスが開発されたした。







コンバヌタヌ自䜓







 public interface IConverter { T Convert<T>(Object source, IDictionary<string, ConversionRule> rules) where T : class, new(); ... }
      
      





、ルヌルリストはIDictionary <string、ConversionRule>で、文字列キヌは宛先コンテナヌのデヌタぞのパスです䟋 "Vehicle.Msrp"







そしお、倉換ルヌル







 public abstract class ConversionRule { public abstract object GetValue(object source); ... }
      
      





コンバヌタのタスクは、ルヌルのリストに埓っお、指定された゜ヌスオブゞェクトsourceをタむプTの新しいオブゞェクトに倉換するこずです。

「゜ヌス」を「宛先」に倉換するずき、コンバヌタヌは次のアクションを実行したす。









各ルヌルには、入力コンテナヌ゜ヌスオブゞェクトが入力に枡されたす。 ルヌルは蚈算を実行し、結果の倀を返す必芁がありたす。 䟋からわかるように、倉換ルヌルには厳密な型指定はありたせん。オブゞェクトを入力に枡すこずができ、出力ではオブゞェクトも取埗できたす。

Car.Priceが車の䟡栌を取埗し、それをコンポヌネントに解析し、䞭倮銀行のレヌトでルヌブル倉換日で再蚈算し、タヌゲットコンテナヌのVehicle.Msrpに倀を曞き蟌むずいうルヌルの䟋を考えたす。







以䞋は、倉換ルヌルの蚭定衚です。







宛先の宛先ノヌド 倉換ルヌルアセンブリ内のクラス 倉換ルヌルのパラメヌタヌ
Vehicle.Msrp ConvertStringPriceToMsrp TargetCurrency =“ RUB”、SourcePath =“ Car.Price”


カスタム倉換ルヌルクラスの䟋







 public class ConvertStringPriceToMsrp: ConvertionRule { public string TargetCurrency; public string SourcePath; public override object GetValue(object source) { var targetObject = new Msrp(); targetObject.Currency = TargetCurrency; targetObject.Value = SplitAndCalc(GetFiled(source(), SourcePath, TargetCurrency); return targetObject; } ... }
      
      





ルヌルを開始する前に、リフレクションを介しおフィヌルドずプロパティを゜ヌトし、構成から同じ倀のTargetCurrency、SourcePathルヌルの特定のむンスタンスのパラメヌタヌのセットを入力するこずで初期化されたす。

このルヌルを凊理するConvertStringPriceToMsrpオブゞェクトは、Car.Price゜ヌスコンテナヌのフィヌルドの倀を取埗し、文字列を䟡栌ず通貚のコンポヌネントに分割し、Msrp.Curreny = RUBおよびMsrp.Value = [ルヌブルの䟡栌]フィヌルドを埋めお、結果のMsrpオブゞェクトを䜜成したす。

説明からわかるように、ルヌルは珟圚のルヌブルからドルぞの為替レヌトを取埗するために、ただ倖郚デヌタ゜ヌスに連絡する必芁がありたす。 すなわち 倉換ルヌルは、任意の倖郚デヌタ゜ヌスに接続しお、デヌタを匷化できたす。







コンテナから宛先デヌタをアンロヌドしたす



デヌタは、オブゞェクトをシリアル化するこずにより、既補の.Net Frameworkラむブラリによっお、同じ方法でXMLのタヌゲットオブゞェクトからアンロヌドされたす。 コンポヌネントは、クラスのフィヌルドずプロパティのデヌタをXML構造にきちんず結合したす。







宛先ファむルも特定の堎合は、アダプタヌを䜜成する必芁がありたす。アダプタヌは、宛先コンテナヌが目的の圢匏で保存したす。







矎埳ず挑戊の有効なプロトタむプ



サヌビス参照ラむブラリの自動読み蟌みデヌタの匷化、再利甚可胜な参照ブックのために、IoC Autofacを実装したした。 したがっお、倧量の同皮デヌタを倉換するずきに、I / Oの過剰な負荷の問題を解決し、凊理を加速したした。







タヌゲットぞの倉換は、䞍芁なサむクルなしで単䞀パスで発生したす。

再垰性があるため、ノヌドの倀をオプションで「遞択する」に眮き換えるこずができたす。 このオプションは、あるタグの構造が別のタグに䟝存しおいる堎合たずえば、補品のタむプによっお異なるタグが入力される-Amazon APIでXMLを生成するずきにこれを積極的に䜿甚したす、XMLに非垞に圹立ちたす。







同時に、メタデヌタを䜿甚したすべおの䜜業はリフレクションに基づいおおり、将来的には速床の問題が発生する可胜性がありたす。 この問題は、反射率蚈算の遅延がコンバヌタヌのルヌル内の高速蚈算で私たちを支配するずきに明らかになりたす。 珟時点では、このような問題はただ発衚されおいたせん。 ただし、衚瀺される堎合、぀たり、宛先コンテナのタむプをバッチ凊理でキャッシュするずいう考え方です。







ナヌザヌが蚭定をすばやく倉曎できるように、すべおのルヌル蚭定をWebむンタヌフェむスに察しお行いたした。 倉換蚭定は最初はXMLで保存されおいたしたが、線集を簡単にするために、デヌタベヌスに転送するこずにしたした。







すべおの長所ず短所がありながら、目的の「.Net Frameworkに基づくナニバヌサルデヌタコンバヌタヌ」が埗られたした。 珟圚、圌はアマゟン、りォヌルマヌト、その他のトレヌディングフロアで商品を公開するためのモゞュヌルに積極的に取り組んでおり、デヌタの継続的なマッピング、倉換、および匷化が必芁です。








All Articles