1

我有一个现有的 asp.net webforms 项目,它使用 Microsoft 的 Enterprise DAAB 作为 DAL,我需要实现一些广泛的功能,并且我想使用 NHibernate 使事情变得更容易。

是否有任何允许混合 DAAB/NHibernate DAL 的设计模式/架构?这是个好主意吗 ?

我的想法是:如果我有一个混合 DAL,我仍然可以通过 DAAB 端传递高流量/非动态查询,并节省动态 sql 生成的开销。但仍然有 nhibernate 用于更复杂的查询。

此外,为 asp.net webforms 应用程序设置 NHibernate DAL/BLL 的最佳方法是什么?我已经阅读了 NHibernate 网站上的教程,其他几个似乎没有就开始/​​结束 nhib 会话达成共识。我只是在寻找最佳实践示例。

谢谢

4

2 回答 2

2

我听说过的一种方法是在与域模型交互时使用 nHibernate。请记住,nHibernate 可以调用存储过程,所以如果你想避免 SQL 生成,你可以,但我建议不要这样做。

如果您对报告或显示数据的查询不想从中创建自定义实体,则可以使用 DAAB,但如果您要创建实体,我不建议这样做。

至于最佳实践,我发现在需要时创建会话,然后将其存储在 httpContext 中,您将在每个请求时关闭会话。

然后唯一的另一件事是专门创建和结束一个事务,如果您的逻辑将跨越多个服务,我将在您的服务层或应用程序层中执行该事务(我将服务定义为不是 web 服务,而是作为屏蔽的高级代码片段您的域层中的应用程序)。

Billy McCafferty 的文章是一个很好的起点:http: //www.codeproject.com/KB/architecture/NHibernateBestPractices.aspx

如果您使用他的方法,他的代码中有一个错误/限制,请查看我的博客文章:http: //jberke.blogspot.com/2008/10/nhibernate-transaction-session-mgmt.html

于 2009-01-08T17:29:09.433 回答
1

您有两个问题 - 您或版主应该将其分成两个问题:1) 一起使用 DAAB 和 NHibernate 的最佳方式是什么?

2) 在 Web 窗体应用程序中设置 NHibernate 的最佳方法是什么?

我可以回答第二个,即在 ASP.NET 中使用一个 HttpModule 来配置每个请求的上下文。可以在此处找到示例模块:http: //tinyurl.com/b5am9b

public class NHibernateSessionModule : IHttpModule
    {
        public void Init(HttpApplication context)
        {
            context.EndRequest += new System.EventHandler(context_EndRequest);
        }

        void context_EndRequest(object sender, System.EventArgs e)
        {
            HybridSessionBuilder builder = new HybridSessionBuilder();
            ISession session = builder.GetExistingWebSession();
            if (session != null)
            {
                                Log.Debug(this, "Disposing of ISession " + session.GetHashCode());
                session.Dispose();
            }
        }

        public void Dispose()
        {

        }
    }
于 2009-01-28T04:17:23.347 回答