一种方法是使用DI 模式,例如 Unity。
实现你data object
有一个构造函数,例如一个 IRepository 接口。此接口的实现处理 nHibernate 会话工厂...
你data object
也可以是通用的 where T
is one 例如User data object
。然后你实现一个方法data object
来保存,更新,删除T
注入IRepository
a的伪代码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
初始化应该在您的global.asax
MVC 项目中完成。您还可以通过 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