: Ich bin sowohl EF und Ninject mich so vergeben, wenn dies keinen Sinn macht :)DbContext Angeordnet nach dem ersten Anfrage bei der Verwendung von Ninject des InRequestScope()
Ich habe eine MVC3 Anwendung mit dem Ninject und Ninject.Web. Gemeinsame Referenzen. Ich versuche, einen DbContext in meine Repositories zu injizieren. Was ich sehe, ist, dass auf der ersten Anfrage, alles funktioniert wunderbar, aber die nachfolgenden Anforderungen zurück:
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)
Meine Bindungen:
kernel.Bind<ISiteDataContext>().To<SiteDataContext>().InRequestScope();
kernel.Bind<IProductRepository>().To<ProductRepository>();
kernel.Bind<IProductService>().To<ProductService>();
Meine Service-Klasse:
public class ProductService : IProductService {
[Inject]
public IProductRepository repository {get; set;}
...
}
Mein Repository Klasse:
public class ProductRepository : IProductRepository {
[Inject]
public ISiteDataContext context {get; set;}
...
}
Meine SiteDataContext Klasse:
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);
}
}
Mein Controller:
public class ProductController {
[Inject]
public IProductService productService {get; set;}
...
}
Wenn ich .InRequestScope() entfernen, dann funktioniert es gut - aber dann, dass Probleme mit Entity Framework verursacht, da Objekte in mehreren separaten geändert werden Instanzen des Datenkontextes.
Gibt es einen Vorteil für die Konstruktorinjektion gegenüber der Attributeinspritzung? –
Absolut, es haftet an der Zusammensetzung Wurzel. Die Verwendung von Attributen für dieses Muster ist aus mehreren Gründen nicht geeignet. Die Verwendung der Konstruktorinjektion funktioniert hier gut, und es ermöglicht Abhängigkeiten zum frühestmöglichen Zeitpunkt bekannt zu machen, und da es keinen Grund gibt, dies als eine optionale Abhängigkeit mit einem Standardwert zu betrachten, ist dies die bevorzugte Methode. Siehe http://www.manning.com/seemann/ welches das beste Buch zu diesem Thema ist. –
Ich verwende DependencyResolver.Current.GetService <... anstelle von Costrusor-Injektion. Ist es möglich, dass dies das gleiche Problem verursacht? (Die Operation kann nicht abgeschlossen werden, da der DbContext entfernt wurde) –