Внедрение моего UnitOfWork в мой конструктор репозитория - PullRequest
0 голосов
/ 25 февраля 2011

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

У меня возникли проблемы с добавлением моего unitofwork в мой базовый репозиторий.Я создаю unitofwork для каждого запроса, а затем фиксирую или откатываю в конце.Но когда пытаешься внедрить в мой базовый репозиторий, он всегда пуст, когда я использую его в моих методах.Более конкретно я получаю эту ошибку: «Ссылка на объект не установлена ​​на экземпляр объекта».Любые идеи, что я делаю не так, и если это правильный маршрут, я должен идти?

Большое спасибо заранее.

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

public abstract class Repository<T> : IRepository<T>
{
  public readonly IUnitOfWork _unitOfWork;

  public Repository(IUnitOfWork UnitOfWork)
  {
    UnitOfWork = _unitOfWork;
  }

  public Repository() {}

  public void Save(T obj)
  {
    _unitOfWork.CurrentSession.Save(obj);
  }
}

Реестр StructureMap вот и всеустановите в моем application_start:

 public class NHibernateRegistry : Registry
 {
   public NHibernateRegistry()
   {
     For<IUnitOfWork>().HybridHttpOrThreadLocalScoped().Use<UnitOfWork>();

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

     For<ISessionFactory>().Singleton().Use(NHibernateSessionFactory.GetSessionFactory());
   }
 }

Обновление:

Базовый репозиторий наследуется определенными репозиториями, т.е. ArticleRepository, а затем внедряет это в мои aspx-страницы на application_start.Тогда моя страница aspx наследует базовую страницу, где происходит buildUp.И я получаю доступ к хранилищу, как это:

public IArticleRepository ArticleRepo { get; set; }

public void SaveThing()
{
    ArticleRepo.Save(object);
}

Это вызывается на application_start:

  public class Bootstrapper
  {
    public static void BootStrap()
    {
      ObjectFactory.Configure(x =>
      {
        x.AddRegistry<NHibernateRegistry>();
        x.AddRegistry<WebRegistry>();
      });
    }
  }

И в веб-реестре:

For<IArticleRepository>().Use<ArticleRepository>();

Ответы [ 2 ]

3 голосов
/ 25 февраля 2011

Есть большая вероятность, что у вашего ArticleRepository нет конструктора, который принимает IUnitOfWork в качестве параметра, убедитесь, что у вас есть следующее

public class ArticleRepository : Repository<Article>
{
    public ArticleRepository(IUnitOfWork unitOfWork) : base(unitOfWork)
    {
    }
...
}

Помните, карта Strcuture использует самый жадный конструктор накласс, который он создает.Поскольку ваш абстрактный класс репозитория никогда не будет создан, он не будет использовать его конструкторы.Я бы также предложил не иметь конструкторов по умолчанию, если ваши классы должны внедрять свои зависимости таким образом.Меньше шансов на ошибки таким образом.

1 голос
/ 25 февраля 2011
  public readonly IUnitOfWork _unitOfWork;

  public Repository(IUnitOfWork UnitOfWork)
  {
    UnitOfWork = _unitOfWork;
  }

Я думаю, что вы хотите написать

  public readonly IUnitOfWork _unitOfWork;

  public Repository(IUnitOfWork UnitOfWork)
  {
    _unitOfWork = UnitOfWork;
  }

Вы присвоили локальную переменную параметру вместо параметра локальной переменной.

Редактировать: Также вы должны написать свой параметр с строчной буквой U 'unitOfWork' вместо 'UnitOfWork'

...