Простой инжектор с веб-API 2. PreApplicationStartMethod не запускается

Я следую луковой архитектуре для своего веб-API и проекта AngularJS. В части Infrastructure.DependencyResolution я использую Simple Injector. Вот мой код:

[assembly: PreApplicationStartMethod(typeof(IocConfig), "RegisterDependencies")]
namespace Infrastructure.DependencyResolution
{
    public class IocConfig
    {
         private static Container _container;

         public static void RegisterDependencies()
         {
              _container = new Container();

              _container.Verify();

              _container.RegisterWebApiRequest<IEntitiesContext>(() =>
              {
                   return new MyContext();
              });

              _container.RegisterWebApiRequest<IUserRepository, UserRepository>();
              _container.RegisterWebApiRequest<IAccountService, AccountService>();
              _container.RegisterWebApiRequest<IUnitOfWork, UnitOfWork>();

         }
    }
}

Теперь, если я попытаюсь ввести URL-адрес для перехода к моему контроллеру учетной записи, я получаю эту ошибку:

Произошла ошибка при попытке создать контроллер типа «AccountController». Убедитесь, что у контроллера есть публичный конструктор без параметров.

Я провел поиск и обнаружил, что Simple Injector имеет другой код для Web Api, предложенный их сайтом< /а> Как:

// This is an extension method from the integration package.
container.RegisterWebApiControllers(GlobalConfiguration.Configuration);

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

Когда я устанавливаю точку останова в методе RegisterDependencies, Visual Studio не останавливается в точке останова.

Может ли кто-нибудь показать мне путь, куда идти?


person Usman Khalid    schedule 30.05.2015    source источник
comment
он не принял GlobalConfiguration.Configuration Что он принял?   -  person Yuval Itzchakov    schedule 30.05.2015
comment
Это означает, что он дал ошибку времени компиляции.   -  person Usman Khalid    schedule 30.05.2015
comment
Он просто не распознал библиотеку.   -  person Usman Khalid    schedule 30.05.2015
comment
Я не вижу никакой связи между вашей проблемой и архитектурой Onion. Возможно, вы захотите переименовать свой вопрос.   -  person Steven    schedule 30.05.2015


Ответы (1)


Вам не хватает регистрации SimpleInjectorWebApiDependencyResolver, как описано в руководстве по интеграции веб-API. :

GlobalConfiguration.Configuration.DependencyResolver =
    new SimpleInjectorWebApiDependencyResolver(container);

Без переопределения значения по умолчанию IDependencyResolver веб-API веб-API просто попытается создать экземпляры контроллера, а для этого требуется, чтобы типы контроллеров имели конструктор по умолчанию. При замене этого IDependencyResolver на SimpleInjectorWebApiDependencyResolver запросы на экземпляры контроллера перенаправляются в контейнер Simple Injector.

Вы добьетесь наибольшего успеха при использовании пакета NuGet для быстрого запуска веб-API Simple Injector. Это загрузит ваше приложение и позволит вам быстро приступить к работе.

person Steven    schedule 30.05.2015
comment
Глобальная конфигурация не распознается. Я пытаюсь включить использование System.Web.Http, но все равно не распознает. :( - person Usman Khalid; 30.05.2015
comment
@UsmanKhalid: GlobalConfiguration определяется в сборке System.Web.Http.WebHost.dll. Вам нужно будет включить это. - person Steven; 30.05.2015
comment
Добавил и попробовал. Но все равно получаю ту же ошибку. Произошла ошибка при попытке создать контроллер типа «AccountController»... - person Usman Khalid; 30.05.2015
comment
@UsmanKhalid: Откуда происходит AccountController? Бьюсь об заклад, это происходит от Controller (который является MVC) вместо ApiController (который является веб-API). прочитайте это, чтобы узнать, как интегрировать Simple Injector с MVC. - person Steven; 30.05.2015
comment
открытый класс AccountController: ApiController - person Usman Khalid; 30.05.2015
comment
@UsmanKhalid: в этом случае Configuration.DependencyResolver может быть переопределен где-то еще в приложении после того, как вы его установили. - person Steven; 30.05.2015
comment
Давайте продолжим обсуждение в чате. - person Steven; 30.05.2015