混合NHibernate DAL / BLL

时间:2009-01-08 17:19:12

标签: asp.net nhibernate webforms daab

我有一个现有的asp.net webforms项目,它使用Microsoft的Enterprise DAAB作为DAL,我需要实现一些广泛的功能,我想使用NHibernate来简化操作。

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

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

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

由于

2 个答案:

答案 0 :(得分: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

答案 1 :(得分: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()
        {

        }
    }