0

我已经按照城堡温莎教程按照相同的思路实现了我的 nhibernate 持久性工具。

看:

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

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

诸如添加了重复键之类的东西。

我认为这与我的映射关系不大,而与设施执行的方式或时间有关。

经过更多研究,我看到人们说会话工厂应该是线程安全的?

如果这是正确的,那么我的假设是我不能单独依靠 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 解决。

4

1 回答 1

0

Windsor 将启动每个设施的次数与您将设施添加到容器中的次数完全相同。

因此,如果您执行一次,它将被初始化一次,并且无需在那里放置任何锁定。

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

于 2013-02-11T08:05:41.303 回答