我有一个包含所有nhibernate映射的Data项目,以及我的存储库:
public class Repository<T> : IRepository<T>
{
private readonly ISessionFactory _sessionFactory;
public Repository()
{
}
public Repository(ISessionFactory sessionFactory)
{
this._sessionFactory = sessionFactory;
}
}
然后我有了特定的存储库,这些存储库派生自此类,如UserRepository等。
public class UserRepository : Repository<IUser>, IUserRepository
{
}
我正在使用StructureMap连接依赖项。
在我的服务项目中,我不想引用任何与nhibernate相关的内容(如果可能的话),以使其独立于ORM。
问题是,我必须在我的服务类中传递ISessionFactory,而存储库将使用它是正确的吗?
在我的Web应用程序(MVC)中,我只想引用我的服务项目,而不是我的nhibernate Data项目。
这种设置可以吗?
答案 0 :(得分:2)
这是来自nHibernate大师Ayende Rahien的一个有趣的blog pos:“简而言之,我完全反对甚至尝试做类似的事情。”
答案 1 :(得分:1)
问题是,我必须在我的服务中传递ISessionFactory 存储库将使用的类是否正确?
情况应该不是这样。服务层不应该依赖于任何ISessionFactory。它应该仅依赖于您的存储库(更准确地说是抽象)。您的存储库需要一个ISessionFactory,或者更确切地说是需要这些存储库的NHibernate实现。
所以不需要在服务层中引用任何NHibernate特定的东西。
在我的网络应用程序(MVC)中,我只想参考我的服务 项目,而不是我的nhibernate数据项目。
这没有任何意义。在yuor ASP.NET MVC项目中,您必须引用所有内容,否则如果未引用实现程序集,则它将不在bin文件夹中,并且您的应用程序将无法工作。
因此,在ASP.NET MVC应用程序中引用它,但唯一可以实际使用它的地方是DI容器的配置,而不是其他地方。您可以将DI容器的配置视为基础架构代码。所有控制器和服务仍将使用抽象,并且永远不会了解NHibernate特定的类。