私はプラグイン自体にいくつかのランタイムインスタンスを持つことができるプラグインシステムを持っています。これらのインスタンスは、持ち込まれる構成オブジェクトがさまざまなAPIを通じてプラグイン自体に利用可能になるように定義されます。AppDomainの基底型として派生型をシリアライズ
構成には、親アプリケーションが理解できる特定の部分が含まれていますが、プラグインがサブクラス化によって独自の部分を指定することが期待されています。
[Serializable]
public class PluginConfiguration {
public string Name { get; set; }
}
public class MyPluginConfiguration : PluginConfiguration {
public string AccessToken { get; set; }
}
これは、部分的にそれだけでJSON/XMLの/ etcとして全体オブジェクトをシリアル化するための主な適用を可能にするよう技術的な理由です。共通の構成とプラグイン固有の構成の両方を維持するためにデータベースに追加します。
各プラグインは、それぞれのAppDomain内でホストされます。しかし、プライマリアプリドメインとプラグインからプラグイン設定を読み込もうとしているときに問題になっています(MarshalByRefObject
はMyPluginConfiguration
オブジェクトインスタンスを返します)
基本クラスにはいくつかの逐次化魔法を実行する方法はありますか?オブジェクトインスタンスがPluginConfiguration
インスタンスとして直列化されることを保証するために、問題をMyPluginConfiguration
インスタンスをシリアライズしている:
- は、カスタム設定の種類は、彼らが
[Serializable]
あったとしても、彼らが持っていない[Serializable]
- ではないかもしれません彼らのアセンブリは、とにかくプライマリアプリドメイン。
理想的には、実装をPluginConfiguration
ベースクラスに限定したいと思います。古い[Serializable]
セマンティクスとAppDomainsは.Netの中で最も一般的な概念ではありません。プラグイン開発者からこれらの側面のいくつかを対処する必要がない場合は、それらを非表示にしたいと考えています。
私が必要になります何が 'fmt.Serialize(PMS、P)である。PluginConfigurationとしてfmt.Deserialize(PMS) '。プラグインアプリケーションドメインは、 'MyPluginConfiguration'型を使用して' Serialize'を行いますが、アプリケーションアプリケーションドメインは 'MyPluginConfiguration'を利用できないので、' Deserialize'には使用できません。代わりに 'Deserialize'に' PluginConfiguration'を使用させてください。 –
これを行う方法を示すために、カスタムバインダーを回答に追加しました。 –
それは役に立つと思う。これまでに 'SerializationBinder'型に遭遇したことはありませんでした。どのようにアプリケーションドメインを使用するために定義するのですか? –