Tôi mới vào cả EF và Ninject nên tha thứ cho tôi nếu điều này không có ý nghĩa :)DbContext vứt bỏ sau khi yêu cầu đầu tiên khi sử dụng InRequestScope Ninject của()
Tôi có một ứng dụng MVC3 với Ninject và Ninject.Web. Tham khảo chung. Tôi đang cố gắng để tiêm một DbContext vào kho của tôi. Những gì tôi nhìn thấy là trên yêu cầu đầu tiên, mọi thứ hoạt động tuyệt vời nhưng yêu cầu tiếp theo trở lại:
System.InvalidOperationException: The operation cannot be completed because the DbContext has been disposed.
at System.Data.Entity.Internal.LazyInternalContext.InitializeContext()
at System.Data.Entity.Internal.Linq.DbQueryProvider.Execute[TResult](Expression expression)
at System.Linq.Queryable.SingleOrDefault[TSource](IQueryable`1 source, Expression`1 predicate)
bindings của tôi:
kernel.Bind<ISiteDataContext>().To<SiteDataContext>().InRequestScope();
kernel.Bind<IProductRepository>().To<ProductRepository>();
kernel.Bind<IProductService>().To<ProductService>();
lớp dịch vụ của tôi:
public class ProductService : IProductService {
[Inject]
public IProductRepository repository {get; set;}
...
}
Repository của tôi lớp học:
public class ProductRepository : IProductRepository {
[Inject]
public ISiteDataContext context {get; set;}
...
}
lớp SiteDataContext của tôi:
public class SiteDataContext : DbContext, ISiteDataContext
{
static SiteDataContext()
{
Database.SetInitializer<SiteDataContext >(null);
}
public DbSet<Product> Products{ get; set; }
protected override void Dispose(bool disposing)
{
base.Dispose(disposing);
}
}
điều khiển của tôi:
public class ProductController {
[Inject]
public IProductService productService {get; set;}
...
}
Nếu tôi loại bỏ .InRequestScope(), sau đó nó hoạt động tốt - nhưng sau đó gây ra vấn đề với Entity Framework từ các đối tượng được sửa đổi trong nhiều riêng các trường hợp của ngữ cảnh dữ liệu.
Có lợi ích gì cho việc xây dựng tiêm vs tiêm thuộc tính? –
Tuyệt đối, nó tuân thủ gốc thành phần. Sử dụng các thuộc tính cho mẫu này không thích hợp vì nhiều lý do. Việc sử dụng hàm tạo constructor hoạt động tốt ở đây và nó cho phép các phụ thuộc được biết đến trong thời gian sớm nhất có thể và vì không có lý do để có điều này như là một phụ thuộc tùy chọn với mặc định ở đây. Xem http://www.manning.com/seemann/ là cuốn sách hay nhất về chủ đề này. –
Tôi đang sử dụng DependencyResolver.Current.GetService <... thay vì tiêm costructor. Có thể điều này đang gây ra cùng một vấn đề? (Thao tác không thể hoàn thành vì DbContext đã được xử lý) –