Tôi có một ứng dụng MVC 5 khá chuẩn bao gồm một tầng kho lưu trữ, lớp dịch vụ và một lớp điều khiển. Để giữ cho mỗi lớp được tách rời và có thể kiểm tra, tôi đang sử dụng Ninject để tiêm phụ thuộc.ASP.NET MVC 5 Quản lý ngữ cảnh không đồng bộ
Để đánh dấu kỹ năng mới, tôi đã quyết định sử dụng các tác vụ mới của Bộ điều khiển tác vụ mới với async/await trên các hoạt động liên kết IO cho các phương thức dịch vụ và bộ điều khiển.
Thông thường tôi chỉ tận dụng các InRequestScope ràng buộc như vậy
kernel.Bind<IDbContext>().To<BlogContext>().InRequestScope();
Nói chung này đang làm việc tốt bây giờ, tuy nhiên nếu tôi đã chọn để gỡ lỗi ứng dụng của tôi, hoặc tham gia nhiều khuôn khổ thực thể theo dõi các đối tượng với nhau và tiết kiệm, Tôi đang tìm thấy bối cảnh đã được xử lý hoặc tôi đang nhận được các vấn đề theo dõi. Tôi thấy lý do tại sao điều này xảy ra, nó hoàn toàn hợp lý bởi vì các hoạt động không còn diễn ra trên thread IIS, do đó, làm thế nào Ninject sẽ biết rằng nó nên được sử dụng cùng một bối cảnh.
Để giải quyết vấn đề này, tôi có thể chuyển ngữ cảnh của mình vào mỗi cuộc gọi kho từ lớp dịch vụ của tôi hoặc thậm chí từ lớp điều khiển nếu cần. Tuy nhiên tôi cảm thấy điều này có vẻ lộn xộn và tôi muốn Ninject quản lý bối cảnh của đối tượng này nếu có thể.
Các chiến lược tốt nhất để xử lý điều này một cách thanh lịch/tối giản trong khi vẫn giữ mã của tôi tương tự như các ví dụ được đưa ra dưới đây là gì?
Dưới đây là một ví dụ về một trong những phương pháp điều khiển của tôi
public virtual async Task<ActionResult> Edit(int id)
{
var editViewModel = await BuildDefaultCreateEditViewModel();
var post = await postService.GetNonDeletedPost(id);
...
...
return View(MVC.Admin.Post.Views.CreateEdit, editViewModel);
}
phương pháp Dịch vụ
public async Task<PostDTO> GetNonDeletedPost(int postId)
{
return (await PostRepostiory.GetPost(postId)).ConvertToDTO();
}
phương pháp Repository
public Task<Post> GetPost(int postId)
{
return QueryableExtensions.SingleOrDefaultAsync(
DbSet.Where(post => post.PostId == postId)
.Include(post => post.PostVersions)
.Include(post => post.Categories)
.Include(post => post.Files));
}
Bạn có sử dụng DbContextFactory không? Tôi có xu hướng sử dụng 'TransientScope' thay vì Request, và tôi không bao giờ gặp bất kỳ vấn đề nào –
Tôi đã thực sự hy vọng rằng tôi có thể sử dụng Ninject theo cách tương tự như một DbContextFactory tương tự như sử dụng InRequestScope. Nếu tôi đã đi xuống con đường của việc sử dụng một DBContextFacotry vấn đề làm thế nào tôi biết được yêu cầu các chủ đề không đồng bộ thuộc về vẫn còn rõ ràng, làm thế nào để tôi phủ nhận điều này? Đối với việc sử dụng phạm vi tạm thời sẽ tạo ngữ cảnh mới cho mỗi kho lưu trữ, nhưng khi tôi đang sử dụng một vài đối tượng ghép (Mặt tiền), và việc lưu sẽ không hoạt động như các đối tượng từ các kho lưu trữ khác nhau. các ngữ cảnh được theo dõi khác nhau. – jps
Thats làm thế nào tôi sử dụng ninject, với DbContextFactory, nó cho phép tôi tiêm bối cảnh vào kho lưu trữ tất cả trong TransientScope. :) –