我想使用扩展方法向域模型添加功能,只有一个聚合根用于检索关联实体,如下所示:
public class User
{
public ICollection<Invoice> Invoices {get; set;}
}
它填充在可注射接口
中public interface ICurrentUserService
{
public User GetCurrentUser();
}
然后,例如在控制器中(在我的情况下,这不是SO的快速示例,控制器仍然使用服务),我想这样做:
var invoice = _currentUserService.GetCurrentUser().Invoices.Specific(id);
var mapped = _mappingEngine.Map<InvoiceModel>(invoice);
return View(mapped);
Specific(id)
是一种扩展方法:
public static Invoice Specific(this ICollection<Invoice> invoices, Guid id)
{
return invoices.SingleOrDefault(i => i.Id == id);
}
然而,这种方法会导致一些问题,最令人担忧的是,在第一次访问集合时,即使您所做的只是LINQ
操作,也不会枚举项目,整个已加载子项列表(除非指定ExtraLazy
并且您只执行Count()
)。我想要发生的是,代理仍然是代理,直到它实际上必须获得最终的项目/集合(因为一些扩展方法,这将涉及返回集合)。
我想要发生的事情是,在扩展方法中调用SingleOrDefault
之前,不会查询数据库,并且当查询数据库时,查询将是样式的'where InvoiceId = ? and UserId = ?'
的{{1}},而不是在加载整个集合后在内存中完成的位置。
这是否可行(流利)NHibernate
或我是否想实现梦想?我只是在这里尝试使用这个项目的方法,为域模型提供一个非常流畅的语法。