gpt4 book ai didi

nhibernate - 让 Ninject 管理我的事务状态,练习关注点

转载 作者:行者123 更新时间:2023-12-04 02:26:52 29 4
gpt4 key购买 nike

我让 Ninject 管理我的 ISessionITransaction使用以下注册方法在 Fluent nHibnerate 中状态 - 我想知道它是否足以控制事务,或者我是否需要将它放在其他地方。

想法是每个ISession是根据请求创建的,并且 Ninject 处理在该请求期间完成的所有事情的提交。

public class SessionModule : Ninject.Modules.NinjectModule
{
private static ISessionFactory sessionFactory;

public override void Load()
{
Bind<ISessionFactory>()
.ToMethod(c => CreateSessionFactory())
.InSingletonScope();

Bind<ISession>()
.ToMethod(c => OpenSession())
.InRequestScope()
.OnActivation(session =>
{
session.BeginTransaction();
session.FlushMode = FlushMode.Commit;
})
.OnDeactivation(session =>
{
if (session.Transaction.IsActive)
{
try
{
session.Flush();
session.Transaction.Commit();
}
catch
{
session.Transaction.Rollback();
}
}
});
}

/// <summary>
/// Create a new <see cref="NHibernate.ISessionFactory"/> to connect to a database.
/// </summary>
/// <returns>
/// A constructed and mapped <see cref="NHibernate.ISessionFactory"/>.
/// </returns>
private static ISessionFactory CreateSessionFactory()
{
if (sessionFactory == null)
sessionFactory = Persistence.SessionFactory.Map
(System.Web.Configuration
.WebConfigurationManager
.ConnectionStrings["Local"]
.ConnectionString
);
return sessionFactory;
}

/// <summary>
/// Open a new <see cref="NHibernate.ISession"/> from a <see cref="NHibernate.ISessionFactory"/>.
/// </summary>
/// <returns>
/// A new <see cref="NHibernate.ISession"/>.
/// </returns>
private static ISession OpenSession()
{
// check to see if we even have a session factory to get a session from
if (sessionFactory == null)
CreateSessionFactory();

// open a new session from the factory if there is no current one
return sessionFactory.OpenSession();
}
}

我使用 System.Diagnostics.Debug.WriteLine 检查了运行时当事情发生时写,它 看起来这是我在做的事情 通缉它要做。我要问你们,社区,这是否是 不错练习与否。这是我的理解。

无数小时阅读 http://ayende.com/blog/default.aspx使我重新评估了我进行 session 管理的很多方式。

大量挖掘 nHibernate 文档告诉我我需要使用 ITransaction 每次我的数据库发生任何事情时 .

将管理放在一个属性中被认为是一个缺陷,因为它不符合上述声明。

ITransaction每个单独的操作不是正确的过程,因为它需要 (A) 我的 Controller 可以访问 ISession或 (B) 我的 IRepository<T>拥有 ITransaction逻辑,我在之前的问题中被告知不是一个好习惯。

放置我的 ITransaction管理在 HttpModule增加了不必要的开销,因为它让我的 HttpContext 了解 ISession这意味着我必须对 HttpRequest 进行某种注入(inject)(我可以使用 [Inject] 来做,但这似乎并不明智)

这使我得出了这个结论。
  • 事务应该在 ISession 时开始。被要求。
  • 中发生的一切单个请求 封装一个 ISession
  • 当一个 ITransaction完成后,需要提交它,以便 2nd Level Cache 可以得到它的结果。

  • 任何人都可以阐明这一点吗?我终于走上正轨了吗?还是我仍然完全错过了重点?

    最佳答案

    我不是专家(也没有 ninject 的经验),但我同意你的 3 个结论,这就是我在项目中所做的。
    我可以补充的另一件事是,在我看来,事务应该被明确地和每个操作控制,而不是像你的代码所建议的那样全局控制(请求的开始和开始以及最后的提交)。
    这是因为我相信您希望单独控制每个操作的事务行为 - 是否提交(或者甚至可能不启动,如果不需要数据库访问)。
    我使用的是一个管理(或工作流,如果你愿意的话)层,它只负责这个。例如:

    public class SomeManager : ManagersBase
    {
    public void DoSomething(DomainObject obj)
    {
    if (obj.Operation())
    {
    using (ITransaction tx = Session.BeginTransaction())
    {
    try
    {
    Session.Update(obj);
    tx.Commit();
    }
    catch (MeaningfulException ex)
    {
    //handle
    tx.Rollback();
    }
    }
    }
    }
    }

    希望这可以帮助

    关于nhibernate - 让 Ninject 管理我的事务状态,练习关注点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5363334/

    29 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com