我已经实现了一个使用DAOFactory和NHibernate Helper进行会话和事务的服务。以下代码非常简化:
public interface IService
{
IList<Disease> getDiseases();
}
public class Service : IService
{
private INHibernateHelper NHibernateHelper;
private IDAOFactory DAOFactory;
public Service(INHibernateHelper NHibernateHelper, IDAOFactory DAOFactory)
{
this.NHibernateHelper = NHibernateHelper;
this.DAOFactory = DAOFactory;
}
public IList<Disease> getDiseases()
{
return DAOFactory.getDiseaseDAO().FindAll();
}
}
public class NHibernateHelper : INHibernateHelper
{
private static ISessionFactory sessionFactory;
/// <summary>
/// SessionFactory is static because it is expensive to create and is therefore at application scope.
/// The property exists to provide 'instantiate on first use' behaviour.
/// </summary>
private static ISessionFactory SessionFactory
{
get
{
if (sessionFactory == null)
{
try
{
sessionFactory = new Configuration().Configure().AddAssembly("Bla").BuildSessionFactory();
}
catch (Exception e)
{
throw new Exception("NHibernate initialization failed.", e);
}
}
return sessionFactory;
}
}
public static ISession GetCurrentSession()
{
if (!CurrentSessionContext.HasBind(SessionFactory))
{
CurrentSessionContext.Bind(SessionFactory.OpenSession());
}
return SessionFactory.GetCurrentSession();
}
public static void DisposeSession()
{
var session = GetCurrentSession();
session.Close();
session.Dispose();
}
public static void BeginTransaction()
{
GetCurrentSession().BeginTransaction();
}
public static void CommitTransaction()
{
var session = GetCurrentSession();
if (session.Transaction.IsActive)
session.Transaction.Commit();
}
public static void RollbackTransaction()
{
var session = GetCurrentSession();
if (session.Transaction.IsActive)
session.Transaction.Rollback();
}
}
在一天结束时,我只想将IService暴露给ASP.NET MVC / Console应用程序/ Winform。我已经可以在控制台应用程序中使用该服务,但希望首先对其进行改进。我想第一个改进是通过城堡注入接口INHibernateHelper和IDAOFactory。但我认为问题在于NHibernateHelper可能会在asp.net上下文中引起问题,其中NHibernateHelper应该根据'每个请求的Nhibernate会话'模式运行。我有一个问题是这个模式是由nhibernate配置部分决定的(设置current_session_context_class = web)还是我能以某种方式通过城堡来控制它?
我希望这是有道理的。最终目的只是揭露THE IService。
感谢。
基督教
答案 0 :(得分:0)
你有两个选择..
1)在WCF中托管它。这允许您从任何所需的源访问。
2)摘要所有特定于代码使用方式的内容。例如,在我们的系统中,我们使用自己的Unit Of Work实现,该实现根据代码的运行位置进行不同的存储。一个小例子是使用WCF调用上下文与当前线程存储内容。