松散耦合项目中NHibernate LINQ查询的问题

本文关键字:LINQ 查询 问题 NHibernate 耦合 项目 | 更新日期: 2023-09-27 18:09:25

希望您能有所帮助!

我已经在MVC 3中开始了一个项目,并在另一个程序集中设置了业务领域模型,接口定义了该程序集和所有将使用它的项目之间的契约。我使用Ninject将依赖项注入到项目中。我在一个特定的LINQ查询中遇到了瓶颈。

    public IEnumerable<ITheInterface> DoMyQuery()
    {
        using (ISession session = _sessionFactory.OpenSession()) {
            var query = (
                from c in session.Query<IMyInterface>()
                where something == anotherthing
                group c by new { c.TheGrouper } into grp
                select new IMyInterface() {
                    Property = grp.Key
                }
            );
            return query.ToList();
        }
    }

现在显然我不能实例化一个接口,但这是我的问题!解决这个问题的唯一方法是实例化具体类,但这违反了我的松耦合规则。以前有人遇到过这种情况吗?

我想我的问题是,我如何使用"选择新对象"在LINQ查询使用接口,而不是具体的类?

注意:只是为了记录,即使我使用我的具体类只是让它工作,我得到一个NHibernate错误的"无法解析属性:键:"…但那是另一个问题。

感谢任何帮助!!

松散耦合项目中NHibernate LINQ查询的问题

仅仅使用接口和DI容器并不意味着您编写了松散耦合的代码。接口应该在应用程序接缝处使用,而不是用于实体:

接缝是你可以改变程序行为的地方没有编辑

From Mark Needham:

…我们想改变代码在特定上下文中的工作方式,但是我们不想在那个地方改变它,因为它需要保持原样

实体(域对象)是应用程序的核心。当你更改它们时,你要在的位置更改它们。然而,围绕数据访问代码构建Seam是一个非常好的主意。它是使用Repository模式实现的。Linq、ICreteria、HQL只是一个实现细节,它隐藏在域驱动的存储库接口后面。一旦您公开了其中一种数据访问技术,您的项目将与它们耦合,并且将更难测试。请看看这两篇文章以及这个和这个答案:

  • 如何编写存储库
  • 通用存储库

我认为调用session.Query()是无效的,因为NHibernate不知道你的意图是"某些映射类(在某处实现)是查询的正确类"。

为了保持松耦合(新操作符是依赖项),您应该使用工厂模式(DAO对象)负责创建(查询)您需要的具体实体。