nhibernate在解决方案中

时间:2011-03-06 11:22:40

标签: visual-studio-2010 nhibernate structuremap

我有这个问题...... 我有一个VS解决方案与这些项目:持久性,域,服务,用户界面。 现在我的问题是我必须在所有使用nhibernate的项目中引用nhibernate。 我是否有可能仅在Persistence项目中引用nhibernate,并且任何引用Persistence项目的项目也可以使用nhibernate?

我使用StructureMap作为DI容器。我已经通过构造函数为ISession设置了依赖注入。所以我必须在通过ISession的每一层(而不是UI)中引用nhibernate。 我想要的是没有nhibernate.dll及其几乎所有项目中引用的所有依赖dll(bytecode.linfu ...),但仅限于持久性。这有可能吗?

由于

1 个答案:

答案 0 :(得分:1)

在Domain项目中,您可以定义数据访问对象的接口。您的NHibernate持久性项目可以引用Domain项目并为数据访问对象提供实现。

您的服务项目可能会引用域而不是持久性。您的服务对象取决于Domain中的数据访问接口。您可以使用DI容器将服务对象连接到Persistence中的NHibernate实现。

将依赖关系Domain -> Persistence更改为Persistence -> Domain是控制反转的一个示例。

我可以想象你现在有以下服务:

using Persistence;
using Domain;

public class UserService
{
  private Persistence.NHibernateUserRepository _repository;
  public UserService (ISession session)
  { 
     _repository = new Persistence.NHibernateUserRepository(session);
    // ...
  }

  // some service methods
}

我建议将其更改为:

using Domain;  // no longer using Persistence package

public class UserService
{
  private Domain.IUserRepository _repository;
  public UserService (Domain.IUserRepository repo)
  { 
    _repository = repo;
    // ...
  }

  // some service methods
}

在您的StructureMap配置中,您配置一个NHibernate会话,您可以将其连接到Persistence.NHibernateUserRepository。然后,您将UserService与此Persistence.NHibernateUserRepository联系起来。我不熟悉StructureMap,所以我无法帮助你解决这些问题。您可能需要阅读: