如何使用nhibernate和多个存储库执行数据库查询(在窗口服务下)

时间:2011-11-15 11:59:39

标签: c# nhibernate windows-services repository

我知道这个问题问了很多(我想),但我找不到最聪明的程序员(谷歌)的明确答案。 我已经实现了一些存储库(不是通用的)但是每个实体一个。

public class Person
{
    public string Name { get; set; }
    public int Id { get; set; }
}

public class Product
{
    public int ProductId { get; set; }
}

public class PersonRepository
{
    ISession Session { get; set; }

    public Person GetById(int id) 
    {
        //...  
    }

    public IEnumerable<Person> GetAll()
    { 
        //... 
    }

}

public class ProductRepository
{
    ISession Session { get; set; }


    public Product GetById(int id)
    {
        //...  
    }

    public IEnumerable<Product> GetAll()
    {
        //... 
    }
}

public class PostOfficeService
{
    ProductRepository _rep1 = new ProductRepository();
    PersonRepository _rep2 = new PersonRepository();

    public IEnumerable<Person> GetAllPersonWithSameIdAsProduct()
    {
        _rep1.GetAll().Where( ... )
        // ??? i want it to perform the query in the DB and not two queries in app memory
    }
}

我应该使用工作单位模式吗? 那里有很多数据和信息,但不能把我的手指放在&#34;右边&#34;解 或者它是一个很好的解决方案?

1 个答案:

答案 0 :(得分:1)

工作单位模式与交易有关 - 我无法看到它与此问题的关系。

GetAllPersonWithSameIdAsProduct应该是您PersonRepository之一的方法 - 或者是第三个更高级的存储库 - 因为,在存储库级别之上,您无权访问该会话。另一种方法是使您的存储库接受ICriteria参数,并使用条件构建器类来创建复杂查询。

但是,使用LINQ-To-NHibernate会使IQueryable实现成为您的存储库,从而更容易解决这些问题,并且您的Service类可以使用LINQ进行查询,而无需知道他们正在与数据库通信。