2009-12-30 36 views
6

Tôi đã xem xét điều này xuất sắc blog có tiêu đề "NHibernate và Đơn vị công việc mẫu" và có một câu hỏi liên quan đến nơi tốt nhất để sử dụng UnitOfWork.Start trong một asp. dự án mvc net.Đơn vị công việc trong một ứng dụng asp.net mvc

SLN của tôi được chia nhỏ thành các dự án sau: -

MVC project 
Repository 
NHibernateUnitOfWork 

Tôi có một giao diện: -

public interface INameRepository 
... 
     IList<Name> GetByOrigin(int OriginId) 
... 

Tôi có một thực hiện cụ thể

 public class NameRepository : INameRepository 
    ... 
      public IList<Name> GetByOrigin(int OriginId) { 
       using (UnitOfWork.Start()) { 
        var query = session.Linq<... 
        return query; 
       } 
      } 
    ... 

Câu hỏi của tôi là thế nào để tôi bọc tất cả các phương pháp của tôi bên trong tất cả các kho của tôi bằng cách sử dụng (UnitOfWork.Start()) hoặc là có một bette r cách tiếp cận?

Tôi đang sử dụng nHibernate, asp.net mvc.

Trả lời

2

Tôi nghĩ Sharp Architecture sẽ giải quyết vấn đề này khá tốt. Những gì họ làm là đặt đơn vị công việc bên trong Bộ lọc hành động ASP .Net MVC. Về cơ bản, bạn có thể xác định một bộ lọc hành động giao dịch như

 

public class TransactionAttribute : ActionFilterAttribute 
{ 
     public override void OnActionExecuting(ActionExecutingContext filterContext) 
     { 
     UnitOfWork.Start(); 
     } 

     public override void OnActionExecuted(ActionExecutedContext filterContext) 
     { 
     UnitOfWork.Stop(); 
     } 
} 
 

và trong lớp điều khiển của bạn đặt thuộc tính Transaction trên Action phương pháp Kết quả của bạn

+9

Một bất lợi của phương pháp này là mọi bộ điều khiển con/render là trong một đơn vị riêng biệt của công việc – Paco

4

Với các đơn vị của mô hình làm việc, bạn không đặt mọi phương pháp DATAACCESS trong một đơn vị riêng biệt của công việc. Bạn sử dụng đơn vị công việc xung quanh toàn bộ công việc cần được thực hiện, đó là trong hầu hết các trường hợp trong một ứng dụng web một yêu cầu web. Ý tưởng là một yêu cầu có thể thất bại hoặc thành công. Khi bạn thêm 2 mục vào cơ sở dữ liệu trong một yêu cầu, cần phải thêm cả hai mục vào hoặc không. Không chỉ một trong số họ. Trong hầu hết các trường hợp, cách dễ nhất để bắt đầu một đơn vị công việc trong ứng dụng mvc (hoặc trang web khác) là trong các phương thức yêu cầu bắt đầu và kết thúc của global.asax

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); 
    } 
} 
+0

Cảm ơn, đây là cách tiếp cận tốt nhất. Chỉ cần sắp xếp ra nếu có một giao dịch hoạt động và xóa nó. Cảm ơn –

Các vấn đề liên quan