Ninject UnitOfWork confusion
Uso Ninject todo el tiempo con mis aplicaciones MVC 3, pero estoy tratando de cambiar el Patrón para que mis Objetos de Datos usen UnitOfWork y tengo problemas para descubrir cómo hacer que Ninject maneje esto correctamente.
Sé que mi implementación de clases funciona cuando se construyen de forma manual en mi aplicación de consola:
<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>
En mi aplicación MVC 3 estoy usando el paquete Ninject.MVC3 NuGet, y esto está en el método RegisterServices.
<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>
Si bien esto funciona en su mayor parte, obtener solicitudes, no se ejecutan todas las solicitudes POST (Insertar, Actualizar, Eliminar). No se lanza ninguna excepción y cuando paso por ella, pasa por el método SaveChanges () sin problemas y vuelve a subir la pila, pero no se ejecuta nada. Entonces sé que debo estar perdiendo algo con mi configuración de Ninject.
Aquí está mi clase de Unidad de Trabajo.
<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>
Aquí está la clase DatabaseFactory:
<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>
Y mi clase DataObjectFactory:
<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>
Este es un patrón similar al utilizado en la aplicación CodePlex de EFMVC, pero no uso AutoFac.
Cualquier pensamiento sobre esto es apreciado.
Gracias.