Verwirrung um UnitOfWork auslösen
Ich verwende Ninject die ganze Zeit mit meinen MVC 3-Anwendungen, aber ich versuche, das Muster für meine Datenobjekte so zu ändern, dass es UnitOfWork verwendet, und ich habe Probleme, Ninject dazu zu bringen, dies richtig zu handhaben.
Ich weiß, dass die Implementierung von Klassen funktioniert, wenn sie in meiner Konsolenanwendung manuell wie folgt erstellt werden:
<code>IDatabaseFactory factory = new DatabaseFactory(); IUnitOfWork worker = new UnitOfWork(factory); IBlogCategoryDao dao = new BlogCategoryDao(factory); IBlogCategoryService service = new BlogCategoryService(dao); BlogCategory category = service.GetById(id); try { if (category != null) { service.Delete(category); worker.Commit(); Console.WriteLine("Category deleted successfully!"); } else { Console.WriteLine("Entity doesn't exist."); } } catch (Exception ex) { Console.WriteLine("Error deleting category: {0}", ex.Message); } </code>
In meiner MVC 3-Anwendung verwende ich das Ninject.MVC3 NuGet-Paket, und dies ist in der RegisterServices-Methode.
<code>private static void RegisterServices(IKernel kernel) { kernel.Bind<IDatabaseFactory>().To<DatabaseFactory>(); kernel.Bind<IUnitOfWork>().To<UnitOfWork>().InRequestScope(); kernel.Bind<IBlogCategoryDao>().To<BlogCategoryDao>(); kernel.Bind<IBlogDao>().To<BlogDao>(); kernel.Bind<IBlogCategoryService>().To<BlogCategoryService>(); kernel.Bind<IBlogService>().To<BlogService>(); } </code>
Während dies größtenteils funktioniert, werden alle POST-Anforderungen (Einfügen, Aktualisieren, Löschen) nicht ausgeführt. Es wird keine Ausnahme ausgelöst, und wenn ich durch die Datei gehe, durchläuft sie problemlos die SaveChanges () -Methode und gibt eine Sicherungskopie des Stacks zurück, es wird jedoch nichts ausgeführt. Ich weiß also, dass mir bei meiner Ninject-Konfiguration etwas fehlen muss.
Hier ist meine Arbeitseinheit.
<code>public class UnitOfWork : IUnitOfWork { private Database _database; <-- DbContext derived class private readonly IDatabaseFactory _databaseFactory; public UnitOfWork(IDatabaseFactory databaseFactory) { this._databaseFactory = databaseFactory; } public Database Database { get { return _database ?? (_database = _databaseFactory.Get()); } } public void Commit() { Database.Commit(); } } </code>
Hier ist die DatabaseFactory-Klasse:
<code>public class DatabaseFactory : Disposable, IDatabaseFactory { private Database _database; public DatabaseFactory() { } public virtual Database Get() { if (_database == null) { _database = DataObjectFactory.CreateContext(); } return _database; } protected override void DisposeCore() { if (_database != null) { _database.Dispose(); } } } </code>
Und meine DataObjectFactory-Klasse:
<code>public static class DataObjectFactory { private static readonly string _connectionString; /// <summary> /// Static constructor. Reads the connectionstring from web.config just once. /// </summary> static DataObjectFactory() { string connectionStringName = ConfigurationManager.AppSettings.Get("ConnectionStringName"); _connectionString = ConfigurationManager.ConnectionStrings[connectionStringName].ConnectionString; } /// <summary> /// Creates the Context using the current connectionstring. /// </summary> /// <remarks> /// Gof pattern: Factory method. /// </remarks> /// <returns>Action Entities context.</returns> public static Database CreateContext() { return new Database(_connectionString); } } </code>
Dies ist ein ähnliches Muster wie in der EFMVC CodePlex-Anwendung, aber ich verwende kein AutoFac.
Alle Gedanken dazu sind willkommen.
Vielen Dank.