C# 松散耦合项目中NHibernate LINQ查询的问题
希望你能帮忙 我在MVC 3中启动了一个项目,并在另一个程序集中设置了业务域模型,接口定义了这个程序集和所有将使用它的项目之间的契约。我使用Ninject将依赖项注入到项目中。我现在遇到了一个具体的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
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只是一个实现细节,在域驱动的存储库接口后面对消费者隐藏。一旦您公开了其中一种数据访问技术,您的项目将与之耦合,并且将更难测试。请看这两篇文章和答案: