松散耦合项目中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错误的"无法解析属性:键:"…但那是另一个问题。
感谢任何帮助!!
仅仅使用接口和DI容器并不意味着您编写了松散耦合的代码。接口应该在应用程序接缝处使用,而不是用于实体:
接缝是你可以改变程序行为的地方没有编辑
From Mark Needham:
…我们想改变代码在特定上下文中的工作方式,但是我们不想在那个地方改变它,因为它需要保持原样
实体(域对象)是应用程序的核心。当你更改它们时,你要在的位置更改它们。然而,围绕数据访问代码构建Seam是一个非常好的主意。它是使用Repository模式实现的。Linq、ICreteria、HQL只是一个实现细节,它隐藏在域驱动的存储库接口后面。一旦您公开了其中一种数据访问技术,您的项目将与它们耦合,并且将更难测试。请看看这两篇文章以及这个和这个答案:
- 如何编写存储库
我认为调用session.Query
为了保持松耦合(新操作符是依赖项),您应该使用工厂模式(DAO对象)负责创建(查询)您需要的具体实体。