ISessionFactory对象通过Appdomain bondaries

时间:2013-04-18 12:42:03

标签: winforms nhibernate appdomain sessionfactory

(我对这个问题有点无望,因为我没有找到任何指向我想要的文章。)

反正:

有没有办法在多个ISessionFactory之间共享一个SessionFactoryImplAppDomain)?

- 或 -

是否可以从此ISession中生成ISessionFactory并将新创建的ISession序列化为其他Appdomain

- 或 -

在基于Winforms的应用程序中,关于启动时间和内存消耗的ISessionFactory / ISession管理成功案例是什么?

长篇故事 (对于喜欢细节的人)

  • 我的应用程序基于ERP Winforms,可以生成多个“子应用程序”(表单);
  • 每个子应用程序都有自己的程序集,可以单独更新;
  • 生成新的AppDomain非常适合隔离每个“子应用程序”的static成员。应用程序完成后,也可以卸载子程序AppDomain资源。我们这样做了一段时间,但由于SessionFactory很昂贵(时间和主要在内存中),这个模型开始变得站不住脚了(现在,我们使用线程和ThreadStatic成员来保存特定信息每个子应用程序);
  • 我们几乎支持Lazy-loading,所以我们也不能放弃这个功能。

我已尝试过的内容:

    共享MarshalByRef
  • ISessionFactory类:我无法使其工作(不记得原因),但序列化ISessionFactory会导致重复内存(a大量)反正。我是对的吗?
  • MarshalByRef生成ISession并将其序列化为另一个AppDomain的类:由于ISession将其属性保存在其父ISessionFactory上,现在位于其他边界,它给我带来了一些很好的说明,告诉我一些属性没有定义。

1 个答案:

答案 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);
        }
    }