Нужна помощь в понимании того, как Ninject получает экземпляр Nhibernate SessionFactory в UnitOfWork? - PullRequest
2 голосов
/ 16 апреля 2011

Таким образом, используя некоторую помощь из учебников, мне удалось подключить сеанс Nhibernate к моим репозиториям и репозиториям к контроллерам с помощью Ninject.Тем не менее, есть одна особенность установки, которую я не осознаю «автоматики» того, что делает Ninject, и надеялся, что кто-то может объяснить.

Ниже мой Ninject ModuleRepository , который наследуется отNinjectModule, который выполняет всю привязку.

public class ModuleRepository : NinjectModule
{
    public override void Load()
    {
        var helper = new NHibernateHelper(ConfigurationManager.ConnectionStrings[Environment.MachineName].ConnectionString);

        Bind<ISessionFactory>().ToConstant(helper.SessionFactory)
            .InSingletonScope();

        Bind<IUnitOfWork>().To<UnitOfWork>()
            .InRequestScope();
        Bind<ISession>().ToProvider<SessionProvider>()
            .InRequestScope();
        Bind<IRepository<Product>>().To<ProductRepository>();
        Bind<IRepository<Category>>().To<CategoryRepository>();
    }
}

Вот класс UnitOfWork :

public class UnitOfWork : IUnitOfWork
{
    private readonly ISessionFactory _sessionFactory;
    private readonly ITransaction _transaction;
    public ISession Session { get; private set; }

    public UnitOfWork(ISessionFactory sessionFactory)
    {
        _sessionFactory = sessionFactory;

        //Open Session
        Session = _sessionFactory.OpenSession();
        Session.FlushMode = FlushMode.Auto;
        _transaction = Session.BeginTransaction(IsolationLevel.ReadCommitted);
    }

    public void Commit()
    {
        if (!_transaction.IsActive)
            throw new InvalidOperationException("There is no active Transaction");
        _transaction.Commit();
    }

    public void Rollback()
    {
        if (_transaction.IsActive)
            _transaction.Rollback();
    }

    //Close open session
    public void Dispose()
    {
        Session.Close();
    }
}

Так что я понимаю, что мы создаем один экземпляр константы, экземпляр которогообъект, который создает Nhibernate SessionFactory.Ниже приведен класс SessionProvider, который возвращает сеанс из объекта UnitOfWork, который оборачивает каждую единицу работы в транзакции.

SessionProvider

public class SessionProvider : Provider<ISession>
{
    protected override ISession CreateInstance(IContext context)
    {
        var unitOfWork = (UnitOfWork)context.Kernel.Get<IUnitOfWork>();
        return unitOfWork.Session;
    }
}

Репозитории принимают ISessionв их конструкторе.Но чего я не вижу, так это того, что UnitOfWork.Session - это «сессия», которая передается в мои репозитории?

Любая помощь в понимании этого была бы великолепна.Спасибо.

1 Ответ

2 голосов
/ 16 апреля 2011

Привязка с использованием:

Bind<ISession>().ToProvider<SessionProvider>().InRequestScope();

заявляет, что должна поддерживать область запросов.Это означает, что Ninject будет кэшировать все запросы на ISession в течение всего HttpRequest - поэтому все внедряемые классы (или явно получающие экземпляр) будут использовать один и тот же экземпляр ISession.В вашей конфигурации то же самое относится и к IUnitOfWork.

См. этот пост Нейта Кохари для описания различных объектов области действия в Ninject.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...