我有一个现有的asp.net webforms项目,它使用Microsoft的Enterprise DAAB作为DAL,我需要实现一些广泛的功能,我想使用NHibernate来简化操作。
是否有任何允许混合DAAB / NHibernate DAL的设计模式/架构?这是一个好主意吗?
我的想法是:如果我有一个混合DAL,我仍然可以通过DAAB端传递高流量/非动态查询,并节省动态sql生成的开销。但仍然有更复杂的查询nhibernate。
另外,为asp.net webforms应用程序设置NHibernate DAL / BLL的最佳方法是什么?我已经阅读了NHibernate网站上的教程,其他几个人似乎没有就开始/结束nhib会话达成共识。我只是在寻找最佳实践示例。
由于
答案 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()
{
}
}