Winforms ISessionFactory对象通过Appdomain绑定

Winforms ISessionFactory对象通过Appdomain绑定,winforms,nhibernate,appdomain,sessionfactory,Winforms,Nhibernate,Appdomain,Sessionfactory,(我对这个问题有点失望,因为我还没有找到任何指向我想要的东西的文章) 总之: 有没有办法在多个AppDomain之间共享单个ISessionFactory(SessionFactoryImpl)呢 --或-- 是否可以从此ISessionFactory生成ISession并将新创建的ISession序列化到不同的Appdomain --或-- 在基于Winforms的应用程序中,在启动时间和内存消耗方面,您在ISessionFactory/ISession管理方面的成功案例是什么 长话短说(对于

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

总之:

有没有办法在多个
AppDomain
之间共享单个
ISessionFactory
SessionFactoryImpl
)呢

--或--

是否可以从此
ISessionFactory
生成
ISession
并将新创建的
ISession
序列化到不同的
Appdomain

--或--

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

长话短说(对于喜欢细节的人):

  • 我的应用程序是基于ERP Winforms的,可以生成多个子应用程序(表单)
  • 每个子应用程序都有自己的程序集,可以独立更新
  • 生成一个新的AppDomain将有助于隔离每个“子应用程序”的
    静态成员。应用程序完成后,也可以卸载子程序AppDomain资源。我们这样做了一段时间,但由于SessionFactory的成本很高(在时间上,主要是在内存中),这个模型开始变得不可行(目前,我们使用线程和
    ThreadStatic
    成员来保存每个子应用的特定信息)
  • 我们非常支持延迟加载,所以我们也不能放弃这个特性
我已经尝试过的:

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

我对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);
        }
    }

我对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);
        }
    }

这只会减少创建SessionFactory的时间,但不会减少其内存消耗。对于您的代码示例,内存似乎是OP.+1中最大的问题。谢谢你。我已经意识到这种可能性(NHiberante Cfg序列化)-在web上有一些例子。但是@cremor是对的:它解决了部分加速时间,对内存消耗没有任何帮助。无论如何,感谢您的及时答复。:)这只会减少创建SessionFactory的时间,但不会减少其内存消耗。对于您的代码示例,内存似乎是OP.+1中最大的问题。谢谢你。我已经意识到这种可能性(NHiberante Cfg序列化)-在web上有一些例子。但是@cremor是对的:它解决了部分加速时间,对内存消耗没有任何帮助。无论如何,感谢您的及时答复。:)