一种方法是使用DI pattern,例如团结。
实现你的data object 有一个构造函数,例如一个IRepository 接口。此接口的实现处理 nHibernate 会话工厂...
您的data object 也可以是通用的,其中T 是其中之一,例如User data object。然后你在data object 中实现一个方法,例如使用注入的IRepository保存、更新、删除T
data object 的伪代码
public interface IEntity
{
}
public interface IRepository
{
ISession Session { get; }
}
public class DataObjectBase<T> where T : IEntity
{
private IRepository Repository { get; set; }
public DataObjectBase(IRepository repository)
{
this.Repository = repository;
}
public T Get(int id)
{
return Repository.Session.Get<T>(id);
}
public void Save(T value)
{
Repository.Session.Save(value);
}
public void Update(T value)
{
Repository.Session.Update(value);
}
public void Delete(T value)
{
Repository.Session.Delete(value);
}
public IQueryable<T> Query()
{
return Repository.Session.Query<T>();
}
}
具体数据对象的实现
public class ADataObject : IEntity
{
public int Id { get; set; }
// [...]
}
为数据对象实现数据上下文
public class ADataObjectContext : DataObjectBase<ADataObject>
{
public ADataObjectContext(IRepository repository)
: base(repository)
{
}
}
使用 Unity 的简单示例测试
public class Test
{
public void Run()
{
IUnityContainer myContainer = new UnityContainer();
myContainer.RegisterType<IRepository, NHibernateRepository>();
var ctx = myContainer.Resolve<ADataObjectContext>();
var obj = ctx.Query().Where(p => p.Id == 2);
}
}
当然,您必须实现 NHibernateRespository 才能做任何您想做的事情。
UnityContainer 初始化应该在 MVC 项目中的 global.asax 中完成。您还可以通过 web.config 配置 Unity。
NHibernateRespository 实际上应该是一个单例。这可以由您实现,或者您只需使用 Unity 功能将您的类型实例化为单例。 new ContainerControlledLifetimeManager() 正是这样做的。
除了将会话公开为属性之外,您还可以公开一个打开新会话的方法。或者您实现一个开始和结束工作单元,这是 Web 环境中的常见做法......
普通存储库模式、工作单元、统一性的其他链接...或者只是在 Google 上搜索 nhibernate 存储库模式
http://slynetblog.blogspot.de/2011/11/in-spite-of-common-now-approach-of.html
http://blog.bobcravens.com/2010/07/using-nhibernate-in-asp-net-mvc/
http://msdn.microsoft.com/en-us/library/dd203101.aspx