gpt4 book ai didi

c# - 在流畅的 nHibernate 中使用通用存储库模式

转载 作者:可可西里 更新时间:2023-11-01 08:05:20 25 4
gpt4 key购买 nike

我目前正在开发一个中型应用程序,它将访问不同站点上的 2 个或更多 SQL 数据库......

我正在考虑使用类似这样的东西: http://mikehadlow.blogspot.com/2008/03/using-irepository-pattern-with-linq-to.html

但是,我想使用流畅的 nHibernate 代替 Linq-to-SQL(当然还有 nHibernate.Linq)

这可行吗?

我将如何配置它?我的映射定义会去哪里等等...?

此应用程序最终将具有许多方面 - 从 WebUI、WCF 库和 Windows 应用程序/服务。

此外,例如在“产品”表上,我会创建一个“ProductManager”类,它具有如下方法:

GetProduct、GetAllProducts 等...

欢迎指点。

最佳答案

在我看来(以及其他一些人的看法),存储库应该是一个在模仿集合界面的界面中隐藏数据访问的界面。这就是存储库应该是 IQueryable 和 IEnumerable 的原因。

public interface IRepository<T> : IQueryable<T>
{
void Add(T entity);
T Get(Guid id);
void Remove(T entity);
}

public class Repository<T> : IQueryable<T>
{
private readonly ISession session;

public Repository(ISession session)
{
session = session;
}

public Type ElementType
{
get { return session.Query<T>().ElementType; }
}

public Expression Expression
{
get { return session.Query<T>().Expression; }
}

public IQueryProvider Provider
{
get { return session.Query<T>().Provider; }
}

public void Add(T entity)
{
session.Save(entity);
}

public T Get(Guid id)
{
return session.Get<T>(id);
}

IEnumerator IEnumerable.GetEnumerator()
{
return this.GetEnumerator();
}

public IEnumerator<T> GetEnumerator()
{
return session.Query<T>().GetEnumerator();
}

public void Remove(T entity)
{
session.Delete(entity);
}
}

我没有在存储库本身中实现类似 SubmitChanges 的方法,因为我想一次提交用户的一个操作所使用的多个存储库的更改。我将事务管理隐藏在一个工作单元界面中:

public interface IUnitOfWork : IDisposable
{
void Commit();
void RollBack();
}

我使用 NHibernate 特定工作单元实现的 session 作为存储库的 session :

public interface INHiberanteUnitOfWork : IUnitOfWork
{
ISession Session { get; }
}

在实际应用程序中,我使用了一个更复杂的存储库接口(interface),其中包含用于分页、预加载、规范模式、访问 NHiberante 使用的其他查询方式而不仅仅是 linq 等方法。 NHibernate 主干中的 linq 实现足以满足我需要执行的大多数查询。

关于c# - 在流畅的 nHibernate 中使用通用存储库模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2587965/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com