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

时间:2011-09-23 14:19:40

标签: c# asp.net-mvc linq nhibernate interface

希望你能帮忙!

我在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查询中使用“select new Object”?

注意:只是为了记录,即使我使用我的具体类来让它工作,我得到一个NHibernate错误“无法解析属性:键:”......但这是另一个问题。< / p>

任何帮助表示赞赏!!

2 个答案:

答案 0 :(得分:2)

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

  

接缝是您可以改变程序行为的地方   没有在那个地方编辑

来自Mark Needham

  

...我们希望改变代码在特定上下文中工作的方式,但我们   不想在那个地方改变它,因为它需要保持原样   它在其他环境中使用时。

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

答案 1 :(得分:0)

我认为调用session.Query&lt; IMyInterface&gt;()是无效的,因为NHibernate并不知道你的意图是“某些映射类(在某处实现)是要查询的正确类”。

要保持松散耦合(新运算符是依赖关系),您应该使用工厂模式(DAO对象)来负责创建(查询)您需要的具体实体。