2012-02-10 13 views
2

私たちは現在、アプリケーションでprotobuf-netを使用しています。逆シリアル化した後にプロパティを注入したいと思います。Spring.netとprotobuf:オブジェクトのインスタンス化

<object id="IDataFactory" type="Project.Impl.DataFactory, Project" /> 

はどのように言うことができる(または関連:直列化オブジェクトはSpring.configファイルにDataFactory

namespace Project 
{ 
    [ProtoContract] 
    public class Model 
    { 
     [ProtoMember] 
     public String Name { get; set; } 

     [ProtoIgnore] 
     public IDataFactory DataFactory { get; set; } 
    } 
} 

と呼ばれる性質を持っている場合

は、たとえば、あなたはあなたのインターフェイスの定義を持っています)、デシリアライズではプロパティーがIDataFactoryに設定されています。

オープンな質問ですので、お気軽にアイデアや提案を投稿してください。

protobuf-netライブラリのオブジェクトインスタンシエータをフックして、Spring.NETを使用してオブジェクトを作成し、プロパティを設定するのは素晴らしいことだと思います。私はこれをどうやってやることができると思いますか?

ありがとうございます!

理想的なシナリオ

私が直接protobuf逆シリアル化後Spring.netによって設定されたのDataFactoryを持っていると思います。

Model model = Serializer.Deserialize<Model>(stream); 
Assert.IsNotNull(model.DataFactory); 
Assert.IsTrue(model.DataFactory is DataFactory); 
+0

しかし、私は完全にはわかりません:protobuf-netは、実際の "Model"インスタンスを作成するための外部ファクトリメソッドと、シリアル化/逆シリアル化中に任意のポイントでコードを呼び出すためのシリアル化コールバックをサポートしています。それらのいずれかが使用されていますか? –

+0

真剣に、私は春に精通していないが、私は本当にprotobufネットに精通している。あなたの理想的なシナリオが何であるかを明確にすれば、それは簡単にできると確信しています –

+0

こんにちは、ありがとう、私は何をしたいのシナリオを追加しました。 –

答えて

3

いるProtobufによって、オブジェクトのインスタンス化にSpring.NETを挿入しようとするよりも簡単な方法は、そのが構築され後にオブジェクトの依存関係を設定するには、Spring.NETを依頼することです。 IObjectFactoryインターフェイスには、これを行うためのメソッドIObjectFactory.ConfigureObject(object target, string name)が用意されています。詳細情報については

、これは基本的に以前からsbohlenの答えのためのコード例であるhttp://springframework.net/doc-latest/reference/html/objects.html#objects-factory-extension

3

を参照してください。

では、次のSpring.Net XML設定ファイルobjects.xmlを持って言う:

<?xml version="1.0" encoding="utf-8"?> 
<objects xmlns="http://www.springframework.net"> 

    <object id="IDataFactory" type="Project.Impl.DataFactory, Project" /> 

    <object id="MyModel" type="MyNameSpace.Model, MyAssembly"> 
    <property name="DataFactory" ref="IDataFactory" />  
    </object> 

</objects> 

次に、あなたが行うことができます:

public void Main(...) 
{ 
    var ctx = new XmlApplicationContext("objects.xml"); 

    Model mdl; 

    using (var file = File.OpenRead("mymodel.bin")) 
    { 
     mdl = ProtoBuf.Serializer.Deserialize<Model>(file); 
    } 

    ctx.ConfigureObject(mdl, "MyModel"); 

    // mdl.DataFactory will be injected with your idDatafactory instance 
} 
1

これは、さまざまな傍受するために使用できるいくつかのポイントを示していデシリアライズの手順:

(異なるシグネチャを使用して同様のサポートがあり、コンテキストなど)。これらの3つのインターセプトポイント(オブジェクトの作成、逆シリアル化の前、逆シリアル化の後)の組み合わせによって、ほとんどのことが可能になるはずです。

+0

こんにちは、これはきちんとした解決策ですが、私はモデルオブジェクトコードを手にしていません。 –

+0

@BaptistePernetそれが動作する限り、私は満足しています; p –

関連する問題