Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 松散耦合项目中NHibernate LINQ查询的问题_C#_Asp.net Mvc_Linq_Nhibernate_Interface - Fatal编程技术网

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

C# 松散耦合项目中NHibernate LINQ查询的问题,c#,asp.net-mvc,linq,nhibernate,interface,C#,Asp.net Mvc,Linq,Nhibernate,Interface,希望你能帮忙 我在MVC 3中启动了一个项目,并在另一个程序集中设置了业务域模型,接口定义了这个程序集和所有将使用它的项目之间的契约。我使用Ninject将依赖项注入到项目中。我现在遇到了一个具体的LINQ查询 public IEnumerable<ITheInterface> DoMyQuery() { using (ISession session = _sessionFactory.OpenSession()) { var

希望你能帮忙

我在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();
        }
    }
public IEnumerable域查询()
{
使用(ISession session=\u sessionFactory.OpenSession()){
变量查询=(
来自会话中的c.Query()
其中某物==另一物
c组由新的{c.TheGrouper}进入grp
选择新IMyInterface(){
Property=grp.Key
}
);
返回query.ToList();
}
}
显然我不能实例化接口,但这是我的问题!唯一的解决方法是实例化具体的类,但这打破了我的松散耦合规则。以前有其他人碰到过这个吗

我想我的问题是,如何通过使用接口而不是具体类在LINQ查询中使用“选择新对象”

注意:作为记录,即使我确实使用我的具体类来让它工作,我也会得到一个NHibernate错误“无法解析属性:Key of:”。。。但这是另一个问题


谢谢你的帮助

我认为call session.Query()是无效的,因为NHibernate不知道您的意图是“某个映射类(在某处实现)是要查询的正确类”


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

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

seam是一个可以在程序中改变行为的地方 没有在那个地方编辑

发件人:

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

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


我认为您可能对“松耦合”这件事做得太过分了。谢谢您的帮助!我在其他地方也用了同样的东西,而且似乎很管用。这只是一个孤立的问题(因为唯一的区别是我使用的是“选择新对象”而不是“选择”在我的LINQ中。然而,工厂模式听起来很有趣,所以我将对此进行研究!感谢这些链接,非常有用!这是我正在处理的一个遗留项目,数据模型完全被破坏了,即没有主键,表之间的关系等-基本上使用RDBMS,比如平面文件系统…我最终不得不使用LINQ到SQL bec因为NHibernate给出了非常错误的结果,所以我在LINQPad中测试了我的LINQ查询,结果很好,但hibernate没有工作——我想这是因为数据模型真的坏了。在HQL、Criteria和LINQ中尝试了相同的查询,结果都是一样的错误!