2017-01-21 5 views
0

У меня есть простое приложение, которое использует класс OWIN-Startup для настройки. НО, я не могу заставить его работать! Вот моя конфигурация:Использование DryIOC в ASP.NET WebAPI на основе OWIN не работает

public void Configuration(IAppBuilder appBuilder) { 

    var httpConfiguration = new HttpConfiguration(); 

    httpConfiguration.Routes.MapHttpRoute(
      name: "default_api_versioned_by_areas", 
      routeTemplate: "api/{area}/{controller}/{action}/{id}", 
      defaults: new { id = RouteParameter.Optional } 
    ); 

    var container = new Container(); 

    // registering my services. They're all good.... 

    container.WithWebApi(
     httpConfiguration, new[] {GetType().Assembly}); 
    container.RegisterWebApiControllers(
     httpConfiguration, new[] { GetType().Assembly }); 

    appBuilder.UseDryIocWebApi(httpConfiguration) 
     .UseDryIocOwinMiddleware(container); 

    appBuilder.UseWebApi(httpConfiguration); 

    // I can resolve other services: 
    var s = container.Resolve<MyOtherService>(); 

    // but I cannot resolve controllers: 
    var c = container.Resolve<ContentController>(); 
} 

Как вы можете видеть, MyOtherService разрешима; Но не ContentController. Кроме того, когда я запрашиваю API, я получаю эту ошибку:

An error occurred when trying to create a controller of type 'ContentController'. Make sure that the controller has a parameterless public constructor.

Googling не помогает. Можете ли вы помочь мне разобраться, как запустить приложение?

UPDATE:

кажется контроллеры не зарегистрированных на-все. Когда я пытаюсь разрешить ContentController - который имеет значение по умолчанию ctor с не-зависимостью - я получаю эту ошибку:

// code: 
var c = container.Resolve<ContentController>(); 

// exception: 

An exception of type 'DryIoc.ContainerException' occurred in DryIoc.dll but was not handled in user code 

Additional information: Unable to resolve MyProject.Areas.Alpha.Controllers.ContentController 

Where CurrentScope: 

    and ResolutionScope: 

    and Found registrations: 

    without matching scope DefaultKey.Of(0),{ID=33, ImplType=MyProject.Areas.Alpha.Controllers.ContentController, Reuse=CurrentScopeReuse {Name="WebRequestScopeName", Lifespan=100}}} 

    without matching scope DefaultKey.Of(1),{ID=37, ImplType=MyProject.Areas.Alpha.Controllers.ContentController, Reuse=CurrentScopeReuse {Name="WebRequestScopeName", Lifespan=100}}} 
+0

Это стандартный ответ, когда ошибка не может разрешить контроллер. Невозможно разрешить одну из зависимостей контроллера. Убедитесь, что все зависимости контроллера могут быть разрешены контейнером IoC. – Nkosi

+0

Ошибка от обновления сообщает, что есть две регистрации ContentController. Кроме того, вы не разрешаете в области запроса - ошибка говорит о соответствующей области. Просто для теста 'var scope = container.OpenScope (Reuse.WebRequestScopeName); scope.Resolve dadhi

+0

@ dadhi там были две регистрации' ContentController'. Пожалуйста, напишите свой комментарий в качестве ответа. Я вызывал 'appBuilder.UseWebApi (httpConfiguration)' и 'appBuilder.UseDryIocWebApi (httpConfiguration)' оба. Удаление второго разрешило проблему –

ответ

1

То есть стандартный ответ ошибки в Web API, когда структура не в состоянии решить контроллер. Невозможно разрешить одну из зависимостей контроллера.

Например, если ContentController был определен как

public class ContentController : ApiController { 

    public ContentController(IOtherService service) { ... } 

} 

и DependencyResovler не знает, как решить IOtherService тогда будет отображаться вышеизложенное ошибка.

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

+0

Я попытался разрешить 'ContentController', которые имеют по умолчанию ctor без зависимости. Кажется, контроллеры вообще не зарегистрированы. –

+0

@Javad_Amiry, только для целей отладки. Если вы должны вручную зарегистрировать контроллер, а затем попытаться его решить, проверьте, будет ли он работать в этом сценарии. – Nkosi

1

Чтобы найти точную ошибку, почему контроллер не разрешен, вы можете пройти throwIfUnresolved параметр до WithWebApi. По умолчанию проглатывается разрешение резервных копий контроллеров на инфраструктуру WebApi и исходное исключение.

container = container.WithWeApi(config, assemblies, throwIfUnresolved: type => type.Name.EndsWith("Controller"));

Смежные вопросы