如何确保我的持久性工具是线程安全的?

时间:2013-02-07 00:25:57

标签: c# asp.net-mvc fluent-nhibernate thread-safety castle-windsor

我已经按照同样的路线在城堡windsor教程之后实现了nhibernate的持久性工具。

请参阅:

http://docs.castleproject.org/Windsor.Windsor-Tutorial-Part-Six-Persistence-Layer.ashx http://docs.castleproject.org/Windsor.Windsor-Tutorial-Part-Seven-Lifestyles.ashx

我在我的应用程序中注意到,当池被释放并且我再次尝试访问它时,我最初会得到与正在构建的会话工厂相关的错误。

类似的事情,已添加重复键等。

我认为它与我的映射关系不大,更多的是与设施执行的方式或时间有关。

经过更多研究,我看到有人说session factory should be thread safe

如果这是正确的,那么我的假设是我不能单独依靠Castle Windsor来确保执行的代码只会执行一次?

请在我的持久性工具下面查看我的init方法,我应该在init方法中添加更多级别的锁定吗?

这是正确的做法吗?

我的设施 - 遵循教程:

public class PersistenceFacility : AbstractFacility
{
    // ... etc.

    protected override void Init()
    {
        Configuration config = BuildDatabaseConfiguration();

        Kernel.Register(Component.For<ISessionFactory>().UsingFactoryMethod(_ => config.BuildSessionFactory()).LifestylePerWebRequest());
        Kernel.Register(Component.For<ISession>().UsingFactoryMethod(k => k.Resolve<ISessionFactory>().OpenSession()).LifestylePerWebRequest());
    }
}

我在App_Start中初始化我的容器,并没有做任何其他特别的事情,我只是使用我的存储库中的ISession,所有这些都使用CastleWindsor解决。

1 个答案:

答案 0 :(得分:0)

Windsor会在您将设施添加到容器时完全启动每个设施。

因此,如果你这样做一次,它将被初始化一次,并且不需要在那里进行任何锁定。

您的代码中唯一看起来很奇怪的事实是您在每个请求上重新创建会话工厂。