(我对这个问题有点无望,因为我没有找到任何指向我想要的文章。)
反正:
有没有办法在多个ISessionFactory
之间共享一个SessionFactoryImpl
(AppDomain
)?
- 或 -
是否可以从此ISession
中生成ISessionFactory
并将新创建的ISession
序列化为其他Appdomain
?
- 或 -
在基于Winforms的应用程序中,关于启动时间和内存消耗的ISessionFactory
/ ISession
管理成功案例是什么?
长篇故事 (对于喜欢细节的人):
static
成员。应用程序完成后,也可以卸载子程序AppDomain资源。我们这样做了一段时间,但由于SessionFactory很昂贵(时间和主要在内存中),这个模型开始变得站不住脚了(现在,我们使用线程和ThreadStatic
成员来保存特定信息每个子应用程序); 我已尝试过的内容:
MarshalByRef
的ISessionFactory
类:我无法使其工作(不记得原因),但序列化ISessionFactory
会导致重复内存(a大量)反正。我是对的吗?MarshalByRef
生成ISession
并将其序列化为另一个AppDomain
的类:由于ISession将其属性保存在其父ISessionFactory
上,现在位于其他边界,它给我带来了一些很好的说明,告诉我一些属性没有定义。答案 0 :(得分:1)
我使用Winforms应用程序的成功故事是,我们在第一次运行应用程序时序列化配置,并在后续运行时加载序列化文件。这大大减少了应用程序启动时间甚至可以使用序列化配置分发应用程序以消除首次运行时的延迟。
序列化看起来像这样:
private const string SERIALIZED_CONFIG = "configuration.bin";
private Configuration GetConfiguration()
Configuration config = null;
config = LoadConfigurationFromFile();
if (config == null)
{
// Create a new configuration, code omitted
config = fluentConfig.BuildConfiguration();
SaveConfigurationToFile(config);
}
}
private Configuration LoadConfigurationFromFile()
{
try
{
if (!IsConfigurationFileValid())
{
return null;
}
using (var file = File.Open(SERIALIZED_CONFIG, FileMode.Open))
{
var bf = new BinaryFormatter();
return bf.Deserialize(file) as Configuration;
}
}
catch (Exception ex)
{
return null;
}
}
private bool IsConfigurationFileValid()
{
if (!File.Exists(SERIALIZED_CONFIG))
{
return false;
}
var configInfo = new FileInfo(SERIALIZED_CONFIG);
// Assumes all assemblies are in same location and written at same time
var asm = _assemblies.First();
var asmInfo = new FileInfo(asm.Location);
if (asmInfo.LastWriteTime > configInfo.LastWriteTime)
{
return false;
}
return true;
}
private void SaveConfigurationToFile(Configuration config)
{
using (var file = File.Open(SERIALIZED_CONFIG, FileMode.Create))
{
var bf = new BinaryFormatter();
bf.Serialize(file, config);
}
}