Структура карты Внедрение в конструктор Единица работы всегда нулевая - PullRequest
1 голос
/ 15 мая 2011

Я пытаюсь передать свой unitofwork в мой базовый репозиторий, но когда я пытаюсь вызвать некоторые методы, unitofwork не передается в базовый репозиторий.

Сценарий: я впрыскиваю userRepository ниже в мой UserController все хорошо, его когда он вызывает userRepository.Save (user), он терпит неудачу из-за null unitofwork. Хотя я не уверен, почему?

Я использую nhibernate и Structuremap. Я думаю, что я все правильно подключил, но вот код для двойной проверки:

Вот базовый репозиторий:

public class BaseRepository<T> : IRepository<T> where T : IAggregateRoot
{
  private readonly IUnitOfWork _unitOfWork;

  public BaseRepository(IUnitOfWork unitOfWork)
  {
    _unitOfWork = unitOfWork; 
  } 

  public BaseRepository()
  {}

  public void Save(T Entity)
  {
    _unitOfWork.Session.Save(Entity);
  }
}

Специальный репозиторий:

  public class UserRepository : BaseRepository<User>, IUserRepository
  {
  }

Это моя конфигурация структуры карты nhibernate:

public NhibernateRegistry()
{
  For<IUnitOfWork>().HybridHttpOrThreadLocalScoped().Use<UnitOfWork>();

  For(typeof(IRepository<>)).Use(typeof(BaseRepository<>));

  // Nhibernate Session 
  For<ISession>().HybridHttpOrThreadLocalScoped().Use(context => context.GetInstance<ISessionFactory>().OpenSession());

  // Nhibernate SessionFactory
  For<ISessionFactory>().Singleton().Use(NhibernateHelper.CreateSessionFactory());
}`

Вот мой http-модуль nhibernate:

public class NHibernateModule : IHttpModule
{
  private IUnitOfWork _unitOfWork;

  public void Init(HttpApplication context)
  {
    context.BeginRequest += ContextBeginRequest;
    context.EndRequest += ContextEndRequest;
  }

  private void ContextBeginRequest(object sender, EventArgs e)
  {
    _unitOfWork = ObjectFactory.GetInstance<IUnitOfWork>();
  }

  private void ContextEndRequest(object sender, EventArgs e)
  {
    try { _unitOfWork.Commit();  }
    catch { _unitOfWork.Rollback();  }
    finally { Dispose(); }
  }

  public void Dispose()
  {
    if (_unitOfWork != null)
      _unitOfWork.Dispose();
  }

}

1 Ответ

4 голосов
/ 15 мая 2011

UserRepository нужен конструктор, который принимает IUnitOfWork и передает его конструктору BaseRepository.В настоящее время UserRepository использует конструктор без параметров BaseRepository, поэтому IUnitOfWork не вводится.Избавьтесь от конструктора без параметров и убедитесь, что все производные типы передают IUnitOfWork в базу.

...