もう1つ(もっと良いと思いますが)アプローチはMarshalByRefObject
です。この方法では、オブジェクト(実際にはオブジェクトへのプロキシ)をAppDomain
の間で渡すことができるので、シリアライゼーションはまったく必要ありません。
は対象
にMSDN documentationをチェックアウトして、これは私も心の中で異なる目的で、数年前に開発された実際の例です。これはカスタムWebサーバーで、更新が利用可能なときにはジョブを中断することなく、自分自身を更新する必要がありました。だからシャドウコピーが目標でしたが、あなたのシナリオではMarshalByRef
のオブジェクトを使用するのが適切であると思います。私が覚えていたよう
public void Boot()
{
if (KernelPartition != null)
{
throw new InvalidOperationException("Kernel partition already exists.");
}
Log.TraceEvent(TraceEventType.Verbose, 0, "Initiating startup sequence...");
KernelPartition = AppDomain.CreateDomain("Kernel", null, new AppDomainSetup() { ApplicationName = "krnl", ShadowCopyFiles = "true" });
KernelPartition.DomainUnload += KernelPartition_DomainUnload;
string engineClassName = null;
string engineAssemblyName = null;
try
{
var engineTypeId = ConfigurationManager.AppSettings["engineTypeId"];
engineClassName = engineTypeId.Split(',')[0].Trim();
engineAssemblyName = engineTypeId.Substring(engineClassName.Length + 1).Trim();
}
catch (Exception)
{
Log.TraceEvent(TraceEventType.Verbose, 0, "Configuration errors detected. Attempting defaults...");
engineClassName = "Contoso.Kernel.Turbine";
engineAssemblyName = "Contoso.Kernel";
}
try
{
// FOCUS ON THE NEXT LINE
KernelTurbine = (ITcsKernel)KernelPartition.CreateInstanceAndUnwrap(engineAssemblyName, engineClassName);
Log.TraceEvent(TraceEventType.Verbose, 0, "Kernel connection established.");
}
catch (Exception ex)
{
Log.TraceEvent(TraceEventType.Verbose, 0, "Failed to establish communication channel with the kernel with the following exception:\n{0}", ex.ToString());
}
if (KernelTurbine == null)
{
InitializeRestart();
}
else
{
try
{
Start();
Log.TraceEvent(TraceEventType.Verbose, 0, "Startup sequence completed.");
KernelTurbine.RebootDelegate = Reboot;
DisposeRestartSecond();
}
catch (Exception ex)
{
string message = string.Format("The startup sequence failed with the following exception:{0}{1}", Environment.NewLine, ex.ToString());
Log.TraceEvent(TraceEventType.Error, 0, message);
InitializeRestart();
}
}
}
は、あなたがCreateInstanceAndUnwrap()
することにより、他のAppDomain
でオブジェクトを作成します。このオブジェクトはMarshalByRefObject
を継承する必要があります。したがって、それを継承し、内部でDataTable
を使用するクラスを作成してください。
ここから対応していただければ幸いです。私は本当に詳細を覚えていませんが、私はあなたが必要な場合はさらに手伝っていきます。
キャッシングはどうですか? – Shaharyar
@Shaharyarすべてがテーブルにあります。私は正直なところ、私が何を探しているのかを100%確信していません。メモリファイルについて考えましたが、それは欠点です。 – JL1
実際には、オブジェクトはです。しかし、RDBMSのようなシナリオが遅すぎると繰り返しデータをすばやく選択したい場合は、RedisなどのコードとDBの間にキャッシングレイヤーを構築してください。 – Shaharyar