是否有可能在我的服务项目中没有NHibernate的引用?

时间:2011-09-15 11:53:04

标签: asp.net-mvc nhibernate structuremap

我有一个包含所有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项目。

这种设置可以吗?

2 个答案:

答案 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特定的类。