1

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

无论如何:

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

- 或者 -

是否可以从中产生ISessionsISessionFactory并将新创建的序列化为ISession不同的 s Appdomain

- 或者 -

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

长篇大论 (对于那些喜欢细节的人)

  • 我的应用程序是基于 ERP Winforms 的,可以产生多个“子应用程序”(表单);
  • 每个子应用都有自己的程序集,可以独立更新;
  • 生成一个新的 AppDomain 可以很好地隔离static每个“子应用程序”的成员。当应用程序完成时,子程序 AppDomain 资源也可以被卸载。我们这样做了一段时间,但是由于 SessionFactory 成本高(在时间上并且主要在内存中),这种模型开始变得站不住脚(目前,我们使用线程和ThreadStatic成员来保存每个子应用程序的特定信息);
  • 我们非常支持延迟加载,所以我们也不能放弃这个功能。

我已经尝试过的:

  • MarshalByRef共享的类ISessionFactory:我无法让它工作(不记得为什么),但是序列化ISessionFactory无论如何都会导致内存重复(大量)。我对吗?
  • MarshalByRef生成ISession并将其序列化到另一个的类AppDomain:由于 ISession 在其父级上拥有它的属性ISessionFactory,现在处于其他边界,它给我带来了一些很好的期望,告诉我一些属性没有定义。
4

1 回答 1

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);
        }
    }
于 2013-04-18T14:59:51.950 回答