2010-10-09 29 views
18

Cố gắng triển khai một đơn vị mẫu công việc bằng cách chuyển một đơn vị công việc vào các kho lưu trữ của tôi.ASP.NET MVC, Ninject, một cá thể cho mỗi yêu cầu đối với nhiều hàm tạo

Mã có liên quan từ Global.asax.

public class SiteModule : NinjectModule 
{ 
    public override void Load() {   
     Bind<IUnitOfWork>().To<SqlUnitOfWork>() 
          .InRequestScope() 
          .WithConstructorArgument("connectionString", ConfigurationManager.ConnectionStrings["Entities"].ConnectionString); 

     Bind<IProductRepository>().To<ProductRepository>(); 
     Bind<ICategoryRepository>().To<CategoryRepository>(); 
    } 
} 


constructors Repository:

public class ProductRepository { 
    IUnitOfWork unitOfWork; 
    public ProductRepository(IUnitOfWork unitOfWork) { 
     this.unitOfWork = unitOfWork; 
    } 
} 

public class CategoryRepository { 
    IUnitOfWork unitOfWork; 
    public CategoryRepository(IUnitOfWork unitOfWork) { 
     this.unitOfWork = unitOfWork; 
    } 
} 


gì tôi muốn là một tối đa là 1 thể hiện của SqlUnitOfWork được tạo ra theo yêu cầu và được thông qua vào kho của tôi (thông qua nhà xây dựng tương ứng của họ).

Phương pháp InRequestScope() trên IUnitOfWork có đủ ràng buộc không? Nếu không làm thế nào tôi có thể đạt được điều này?

+3

Vâng. Chỉ có một thể hiện của 'IUnitOfWork' sẽ được cấp cho bất kỳ lớp nào yêu cầu nó (thông qua constructor injection hoặc gọi tới' .Get <> 'etc.) của hạt nhân – Omar

+1

chúng ta đang sử dụng cùng một mẫu với bạn (ngoại trừ chúng ta sử dụng structuremap cho DI). Chúng ta trông hơi khác một chút. Chúng tôi mới tạo một sqlcontext cho mỗi httprequest, không phải là một UoW. Một yêu cầu có thể có nhiều UoW. – RPM1984

+1

Baddie - thêm bạn bình luận như một câu trả lời để nó có thể được upvoted và chấp nhận. –

Trả lời

8

Mã bạn có sẽ hoạt động tốt. Chỉ có một trường hợp IUnitOfWork sẽ được cấp cho bất kỳ lớp nào yêu cầu nó (thông qua hàm tạo/thuộc tính tiêm hoặc gọi tới số .Get<> của hạt nhân, v.v.)

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