我在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>
任何帮助表示赞赏!!
答案 0 :(得分:2)
仅使用接口和DI容器并不意味着您编写松散耦合的代码。接口应该在应用程序Seams使用,而不是在实体:
接缝是您可以改变程序行为的地方 没有在那个地方编辑
来自Mark Needham:
...我们希望改变代码在特定上下文中工作的方式,但我们 不想在那个地方改变它,因为它需要保持原样 它在其他环境中使用时。
实体(域对象)是您应用的核心。当您更改它们时,您将更改为。然而,围绕您的数据访问代码构建Seam是一个非常好的主意。它使用Repository模式实现。 Linq,ICreteria,HQL只是一个实现细节,在域驱动的存储库接口背后隐藏着消费者。一旦您公开了这些数据访问技术之一,您的项目将与它们耦合,并且将更难以测试。请查看这两篇文章以及this和this个答案:
答案 1 :(得分:0)
我认为调用session.Query&lt; IMyInterface&gt;()是无效的,因为NHibernate并不知道你的意图是“某些映射类(在某处实现)是要查询的正确类”。
要保持松散耦合(新运算符是依赖关系),您应该使用工厂模式(DAO对象)来负责创建(查询)您需要的具体实体。