Ninject UnitOfWork путаница
Я все время использую Ninject с моими приложениями MVC 3, но я пытаюсь изменить шаблон для своих объектов данных, чтобы использовать UnitOfWork, и у меня возникают проблемы с выяснением, как заставить Ninject справиться с этим должным образом.
Я знаю, что моя реализация классов работает, когда они создаются вручную, как это в моем консольном приложении:
<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>
В моем приложении MVC 3 я использую пакет NuGet Ninject.MVC3, и это в методе 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>
Хотя по большей части это работает, запросы Get, все запросы POST (Insert, Update, Delete) не выполняются. Не генерируется исключение, и когда я выполняю его, он без проблем проходит через метод SaveChanges () и возвращает обратно в стек, но ничего не выполняется. Итак, я знаю, что я должен что-то упустить в моей конфигурации Ninject.
Вот мой класс Unit of Work.
<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>
Вот класс 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>
И мой класс 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>
Это аналогичный шаблон, который используется в приложении EFMVC CodePlex, но я не использую AutoFac.
Любые мысли по этому поводу приветствуются.
Благодарю.