StructureMap - NullReferenceException - PullRequest
1 голос
/ 09 июня 2011

Я новичок в IoC и пытаюсь начать использовать StructureMap, но он выдает исключение NullReferenceException при попытке получить экземпляр объекта. Вот мой код инициализации:

ObjectFactory.Initialize(x =>
{
    x.ForRequestedType<IRepository<Customer>>().TheDefaultIsConcreteType<EFRepository<Customer>>();             
    x.ForRequestedType<ICustomerManager>().TheDefaultIsConcreteType<CustomerManager>();
});

ICustomerManager использует инъекцию ctor и получает IRepository:

public class CustomerManager : ICustomerManager
{
  IRepository<Customer> _repository;
  public CustomerManager(IRepository<Customer> repository)
  {
    _repository = repository;
  }

  public Customer GetCustomerById(int id)
  {
    return _repository
             .With(c => c.PhoneNumbers)
             .FirstOrDefault<Customer>(c => c.Id == id);
  }

  public IEnumerable<Customer> GetCustomersByName(string lastName, string firstName, string middleName)
  {
    return _repository.Query(new CustomerMatchesName(lastName, firstName, middleName));
  }
}

Затем в моем коде уровня сервиса эта строка выдает исключение:

var manager = ObjectFactory.GetInstance<ICustomerManager>();

Я действительно понятия не имею, с чего начать отладку, так как я новичок в концепциях вообще. Есть идеи, что может пойти не так в таком простом сценарии?

1 Ответ

2 голосов
/ 09 июня 2011

Скорее всего, вы получаете исключение, что StructureMap не может построить объект, что вызывает каскадное исключение нулевой ссылки, которая съела реальное исключение.

Лучшим решением для отладки этих сценариев является включение перехвата всех исключений, Ctrl + Alt + E и пометка для перехвата всех сгенерированных исключений.

Следующий инструмент, который нужно перейти, это StructureMap, предоставляющий служебный метод ObjectFactory.WhatDoIHave();

Во всех моих проектах у меня есть код инициализации в Application_Start (я делаю только asp.net). У меня есть следующий блок кода

#if DEBUG
    string path = Server.MapPath("~/myproj.WhatDoIHave.txt");
    string whatDoIHave = ObjectFactory.WhatDoIHave();
    File.WriteAllText(path, whatDoIHave);
#endif

Этот вывод предложил мне помощь бесчисленное количество раз. Умение читать этот файл позволит вам в основном устранять любые проблемы с регистрацией, которые у вас есть, потому что вы сможете точно видеть, что вы делаете, а чего нет.

В большинстве случаев, используя StructureMap, вы устраняете неисправности, которых у вас нет. Что обычно сводится к необходимости регистрации сложного типа, который не может удовлетворить StructureMap.

...