定义了一个domain model
我想弄清楚如何做剩下的工作。
数据访问层
我之前读过,没有必要编写自己的UnitOfWork
实现代码ISession
(尽管我发现了很多关于如何做得很好的信息)。所以我很困惑..我有这样的存储库界面:
public interface IRepository<T> where T: AbstractEntity<T>, IAggregateRoot
{
T Get(Guid id);
IQueryable<T> Get(Expression<Func<T, Boolean>> predicate);
IQueryable<T> Get();
T Load(Guid id);
void Add(T entity);
void Remove(T entity);
void Remove(Guid id);
void Update(T entity);
void Update(Guid id);
}
在具体实现中有两种选择:
选项 A
是ISessionFactory
通过构造函数注入并具有类似于:
public class Repository<T> : IRepository<T> where T : AbstractEntity<T>, IAggregateRoot
{
private ISessionFactory sessionFactory;
public Repository(ISessionFactory sessionFactory)
{
this.sessionFactory = sessionFactory;
}
public T Get(Guid id)
{
using(var session = sessionFactory.OpenSession())
{
return session.Get<T>(id);
}
}
}
选项 B
是使用NHibernateHelper
类
using(var session = NHibernateHelper.GetCurrentSession())
{
return session.Get<T>(id);
}
NHibernateHelper
在哪里
internal sealed class NHibernateHelper
{
private const string CurrentSessionKey = "nhibernate.current_session";
private static readonly ISessionFactory sessionFactory;
static NHibernateHelper()
{
sessionFactory = new Configuration().Configure().BuildSessionFactory();
}
public static ISession GetCurrentSession()
{
HttpContext context = HttpContext.Current;
ISession currentSession = context.Items[CurrentSessionKey] as ISession;
if(currentSession == null)
{
currentSession = sessionFactory.OpenSession();
context.Items[CurrentSessionKey] = currentSession;
}
return currentSession;
}
public static void CloseSession()
{
HttpContext context = HttpContext.Current;
ISession currentSession = context.Items[CurrentSessionKey] as ISession;
if(currentSession == null)
{
return;
}
currentSession.Close();
context.Items.Remove(CurrentSessionKey);
}
public static void CloseSessionFactory()
{
if(sessionFactory != null)
{
sessionFactory.Close();
}
}
}
首选什么选项?
为什么(除了注射)?
如果我使用选项A
我在哪里放置配置ISessionFactory
?
它应该放在ASP.NET MVC
项目中的某个地方吗?如何?
感谢您阅读怪物问题!感谢您的指导!