シリアライゼーションは、依存性注入の使用を排除しますか?


9

簡単な質問:C#でのシリアル化にはデフォルトのコンストラクターが必要であることを理解しています。これは、コンストラクターで注入されたDIを使用する可能性を排除します(これは、私の読みでは、一般的に好ましいスタイルのDI です[引用が必要])。それは本当にどちらか一方の状況ですか、それとも何か不足していますか?

(サイド質問):IoCコンテナーはこのトレードオフをどうにかして回避しますか?


This would eliminate the possibility of using Constructor injected DI - なぜ?シリアル化の目的でデフォルトコンストラクターを含める限り、パラメーター化されたインストラクターを使用できます(必要に応じて、デフォルトコンストラクターをプライベートにすることもできます)。
Robert Harvey 14年

@RobertHarvey:私は少し密度が高いと感じていますが、あなたを完全には理解できません。「パラメータ化されたインストラクター」とは何ですか?(タイプミス?)オブジェクトが逆シリアル化されると、それを再度構築することはできません。デフォルトで構築されたオブジェクトでプロパティ/セッター注入を使用することを提案していますか?
kmote 2014年

1
パラメータ化されたコンストラクタは、パラメータを持つものです。ここでは、依存関係注入を使用して適切に構築されたオブジェクトから派生したデータから逆シリアル化が行われると想定しています。逆シリアル化中にオブジェクトを構築する必要はありません。それは以前にすでに建設されました。
Robert Harvey 14年

1
いいえ、間違えていません。それはそれが機能する方法です。それをバックドアインジェクションと考えてください。検証は行われませんが、機能します。BinaryFormatterとDataContractSerializerはデフォルトのコンストラクタを必要としないことに注意してください。
Robert Harvey 14年

1
明確にするために、逆シリアル化はすべて、オブジェクトの状態をXMLオブジェクトで指定された値で埋めることです。これはリフレクションを使用してこれを実現し、あらゆる形式のコンストラクター検証ロジックをバイパスするため、DIの観点から見ると、これらのXML値が通常のDIを通じて構築されたオブジェクトに由来しない限り、不正です。
Robert Harvey 14年

回答:


6

標準のシリアル化メカニズムを使用して、C#の1つのステップで、オブジェクトを逆シリアル化し、別の既存のオブジェクトに依存関係を注入することはできません。代わりにプロパティインジェクションを使用する必要があります。まずデシリアライザを使用してオブジェクトを作成し、その後依存関係をインジェクトします。ほとんどの実際のアプリケーションでは、これが本当の欠点であることは考慮していません。シリアライズ可能なデータモデルクラスがあり、他の非データモデルクラスにも依存している場合は、データモデルクラスにすでに多くの責任。

それが本当に気になる場合は、シリアライザブルオブジェクトをデコレータクラスでラップすることを検討してください。デシリアレータクラスと追加の依存関係をコンストラクタに渡すことができます。そのラッパーは、コンストラクターで2つのステップ(ラップされたオブジェクトの逆シリアル化とプロパティインジェクション)を実行します。


1

私はこのような問題を解決しています。依存関係のファクトリーを注入することです。これらのファクトリーでは、まずコンテナーに登録されている依存関係を解決し、次に残りのすべてのデータを「非直列化」します。json.netを使用すると、既存のオブジェクトのフィールドにデータを設定できます。

工場のコードはIoCコンテナーの配線コードと一緒なので、container.Resolveファクトリー内での使用はルールに違反しないと思いcontainerます。これは、コード内の1か所でのみ使用する必要があります。

今のところ、リフレクションを使用してこのプロセスを自動化しようと試みています(私がそのアプローチをテストしてきたものとは対照的です)。はい、json.netの逆シリアル化自体に残っているものは多くありません。その一部はカスタムコードで置き換えられますが、なぜわざわざそうなのでしょう。

また、この件に関する最終的な考えや決定は何でしたか?この投稿を読んだ後、2つの方法を確認します。または注入してから、逆シリアル化(設定)します。そして、私はまだ自分の道がより良いと思っています。これに反対する議論を聞いて喜んでいます(私の考えでは、私の場合は私の方法の方が良いかもしれませんが、それが失敗した場合のちょっとした推測だけで、良い代替案をはっきりと想像することはできません)。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.