[英]The unit of work pattern within a asp.net mvc application
我一直在關注這個名為“NHibernate和工作單元模式”的優秀博客 ,並且有一個關於在asp.net mvc項目中使用UnitOfWork.Start的最佳位置的問題。
我的SLN分為以下幾個項目: -
MVC project
Repository
NHibernateUnitOfWork
我有一個界面: -
public interface INameRepository
...
IList<Name> GetByOrigin(int OriginId)
...
我有一個具體的實現
public class NameRepository : INameRepository
...
public IList<Name> GetByOrigin(int OriginId) {
using (UnitOfWork.Start()) {
var query = session.Linq<...
return query;
}
}
...
我的問題是我使用(UnitOfWork.Start())將所有方法包裝在我的所有存儲庫中,還是有更好的方法?
我正在使用nHibernate,asp.net mvc。
使用工作單元模式,您不會將每個dataaccess方法放在單獨的工作單元中。 您可以圍繞需要完成的整個工作使用工作單元,這在大多數情況下是Web應用程序中的webrequest。 這個想法是請求可能失敗或成功。 在一個請求期間向數據庫添加2個項目時,應同時添加或不添加。 不只是其中之一。 在大多數情況下,在mvc(或其他Web)應用程序中啟動工作單元的最簡單方法是在global.asax的begin和end請求方法中
class Global
{
BeginRequest()
{
servicelocater.get<unitofwork>().start();
}
EndRequest()
{
var unit = servicelocater.Get<Unitofwork>();
try
{
unit.commit();
}
catch
{
unit.rollback();
throw;
}
}
}
class Repository<T>
{
public Repository(INHibernateUnitofwork unitofwork)
{
this.unitofwork = unitofwork;
}
public void Add(T entity)
{
unitofwork.session.save(entity);
}
}
我認為Sharp Architecture很好地解決了這個問題。 他們所做的是將工作單元放在ASP .Net MVC Action Filter中。 基本上你可以定義一個事務Action過濾器,如
public class TransactionAttribute : ActionFilterAttribute
{
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
UnitOfWork.Start();
}
public override void OnActionExecuted(ActionExecutedContext filterContext)
{
UnitOfWork.Stop();
}
}
並在您的控制器類中將Transaction屬性放在Action Result方法上
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.