您使用存儲庫枚舉聚合根。通常情況下,您的控制器可以使用聚合根目錄,您可以根據用戶需要過濾,排序等。
因此,我用什麼沿着已經提到的行庫。
然而,有時我需要,其中使用聚合根和/或儲存庫的一大堆要麼是痛苦的,低效的,或者是不可能的,以更復雜的規範,內工作。例如,您可能需要運行大型商業報告,或者執行批處理命令。
在這種情況下,我也定義了ICommand
/IQuery
,NH基地實施照顧管道的東西(就像一般的Repository
一樣)。
什麼話,我要做的就是讓代表進行了規範合同,露出我可能需要幫助我建立所需要的參數的任何成員的接口。然後,我使用NH作爲主幹來實現該規範,使用任何最適合的技術(HQL語句,原始SQL,Criteria,QueryOver等等)完成規範。
下面是我的意思的一個粗略的例證。請注意,我使用任意ICommandProvider
,這是一些根據需要創建新命令實例的對象(如果需要在一個操作中發出多個命令)。我將向IoC註冊我的命令,並讓提供者使用它來創建命令實例。在控制器
public interface ICommand
{
}
public interface ICommandProvider
{
TCommand Create<TCommand>()
where TCommand : ICommand;
}
public interface IQuery<TResult> : ICommand
{
TResult Execute();
}
public class NhCommand : ICommand
{
// plumbing stuff here, like finding the current session
}
public class DelinquentAccountViewModel
{
public string AccountName { get; set; }
public decimal Amount { get; set; }
}
public interface IDelinquentAccountsQuery : IQuery<IEnumerable<DelinquentAccountViewModel>>
{
void AmountGreaterThan(decimal amount);
// you could define members for specifying sorting, etc. here
}
public class DelinquentAccountsQuery : NhCommand
{
public IEnumerable<DelinquentAccountViewModel> Execute()
{
// build HQL and execute results, resulting in a list of DelinquentAccountViewModels
// using _amountGreaterThan as a parameter
return null;
}
private Decimal _amountGreaterThan;
public void AmountGreaterThan(Decimal amount)
{
_amountGreaterThan = amount;
}
}
用法可能是這樣的:
public class DelinquentAccountsController : Controller
{
protected ICommandProvider CommandProvider { get; private set; }
public DelinquentAccountsController(ICommandProvider commandProvider)
{
CommandProvider = commandProvider;
}
public ActionResult Index(decimal amount)
{
var query = CommandProvider.Create<IDelinquentAccountsQuery>();
query.AmountGreaterThan(amount);
return View(query.Execute());
}
}
沒有說所有的數據訪問使用命令/查詢你不能這樣做,但它更多的工作比我更需要。我發現標準存儲庫方法(使用針對NHibernate的LINQ)處理我的應用程序需要的95%左右的數據訪問。
謝謝Bronumski ,我想我會結合使用:Web服務調用的定義明確的方法和額外的IQueryable接口來處理來自Web前端的通用查詢。 – mbue 2012-03-22 12:45:56