2015-01-30 2 views
11

У меня такая же проблема, как и у described here, и моя настройка почти identical to this, которая фактически основана на this guide. Когда я доступ к методу в мой контроллер я получаю это произошлоИспользование простого инжектора в веб-API и OWIN

Ошибка при попытке создать контроллер типа 'TestController. Удостоверьтесь, что контроллер имеет безкоммертный публичный конструктор .

Вот трассировки стека

at System.Web.Http.Dispatcher.DefaultHttpControllerActivator 
    .Create(HttpRequestMessage request, HttpControllerDescriptor controllerDescriptor, 
    Type controllerType)\r\n 
at System.Web.Http.Controllers.HttpControllerDescriptor 
    .CreateController(HttpRequestMessage request)\r\n 
at System.Web.Http.Dispatcher.HttpControllerDispatcher.<SendAsync>d__1.MoveNext() 

А вот трассировки стека внутреннее исключение в

at System.Linq.Expressions.Expression.New(Type type)\r\n 
at System.Web.Http.Internal.TypeActivator.Create[TBase](Type instanceType)\r\n 
at System.Web.Http.Dispatcher.DefaultHttpControllerActivator 
    .GetInstanceOrActivator(HttpRequestMessage request, Type controllerType, Func`1& activator)\r\n 
at System.Web.Http.Dispatcher.DefaultHttpControllerActivator 
    .Create(HttpRequestMessage request, HttpControllerDescriptor controllerDescriptor, Type controllerType) 

Вот что мой контроллер выглядит

public class TestController : ApiController 
{ 
    private readonly ITestRepo _repo; 
    public TestController(ITestRepo repo) 
    { 
     _repo = repo; 
    } 

    public IEnumerable<string> Get() 
    { 
     return new string[] { "value1", "value2" }; 
    } 

    public string Get(int id) 
    { 
     return _repo.GetId(id); 
    } 
} 

А вот как настроить Простой инжектор

public class Startup 
{   
    public void Configuration(IAppBuilder app) 
    { 
     // Create the container as usual. 
     var container = new Container(); 
     // Register your types, for instance using the RegisterWebApiRequest 
     // extension from the integration package:  
     container.RegisterWebApiRequest<ITestRepo, TestRepo>(); 

    container.RegisterWebApiControllers(GlobalConfiguration.Configuration); 

     container.Verify(); 

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

     // 
     ConfigureOAuth(app, container); 

     var config = new HttpConfiguration(); 
     WebApiConfig.Register(config); 
     app.UseWebApi(config); 
    } 
} 
+0

http://blog.ploeh.dk/2012/09/28/DependencyInjectionandLifetimeManagementwithASP.NETWebAPI/ – Aron

+1

Из трассировки стека кажется что Simple Injector * не * участвует при разрешении контроллеров. Проверьте, что значение 'GlobalConfiguration.Configuration.DependencyResolver' находится во время выполнения. Вероятно, что-то сбрасывается. Вам нужно выяснить, где это происходит. В методах 'WebApiConfig.Register' или' app.UseWebApi' возможно? – Steven

+0

Я думаю, что это «задействовано», потому что при вызове «container.Verify» происходит сбой каждого из контроллеров ctor. Если я правильно понял, это то, что для «Verify». –

ответ

19

У меня была такая же проблема, но с UnityDependencyResolver. Но я думаю, что он также должен работать для SimpleInjectorWebApiDependencyResolver. Попробуйте зарегистрировать распознаватель, как это (как свойство HttpConfiguration):

public void Configuration(IAppBuilder app) 
{ 
    var container = GetContainer(); // Initialise container 

    HttpConfiguration config = new HttpConfiguration 
    { 
     DependencyResolver = new SimpleInjectorWebApiDependencyResolver(container); 
    }; 

    WebApiConfig.Register(config); 
    app.UseWebApi(config); 
} 
+0

Сладкий! Благодаря! Как это решило проблему? Есть ли где-нибудь блог, который объясняет это (в лучшем случае, если есть). –

+1

@vonv. Как и вы, я пытался найти решение в разных блогах, потому что также столкнулся с одной и той же проблемой, но, наконец, заметил, что в блоге asp.net Майк Уассон устанавливает зависимое решение на свойстве DependencyResolver глобального объекта HttpConfiguration: http: // www .asp.net/web-api/overview/advanced/dependency-injection –

+0

Смысл, спасибо еще раз. –