2016-06-09 1 views
16

Я использую ASP.NET MVC Core RC-2. У меня есть веб-проект, ориентированный на полную платформу .NET. У меня также есть отдельная библиотека классов в решении, а также таргетинг на полную структуру.ASP.NET Core MVC-контроллеры в отдельной сборке

В библиотеке классов у меня есть контроллер, отмеченный атрибутом маршрута. Я ссылался на библиотеку классов из веб-проекта. Эта сборка ссылается на пакет nuget Microsoft.AspNetCore.Mvc v. 1.0.0-rc2-final.

Было мое понимание, что этот внешний контроллер будет обнаружен автоматически, например. http://www.strathweb.com/2015/04/asp-net-mvc-6-discovers-controllers/

Однако это не работает для меня - я просматриваю URL-адрес маршрута, и я получаю пустую страницу, и это не ударит по моей контрольной точке контроллера.

Любые идеи, как заставить это работать?

Интересно, что он работает для веб-проектов, ориентированных на .NET Core Framework, ссылаясь на библиотеку классов, также ориентированную на .NET Core. Но не для веб-проекта, ориентированного на полную структуру, ссылаясь на стандартную библиотеку классов .NET.

Примечание: это MVC Core, который должен поддерживать этот сценарий без MVC<=4 routing overrides.

+0

Возможный дубликат [Как зарегистрировать контроллер в ASP.NET MVC, когда класс контроллера находится в другой сборке?] (Http://stackoverflow.com/questions/7560005/how-to-register-a-controller -into-asp-net-mvc-when-the-controller-class-is-in-a) – Oscar

+0

Это MVC Core - новый стек ASP.NET – booler

ответ

4

Я считаю, что вы сталкиваетесь со следующей известной проблемой в RC2. https://github.com/aspnet/Mvc/issues/4674 (обходной путь упоминается в ошибке)

Это было исправлено с тех пор, но будет доступен только в следующем выпуске (если вы не в порядке с использованием ночных сборках)

36

Еще вопрос в ASP.Net Ядра 1.0, не уверен, что это сейчас по дизайну. Простейшее решение сделать это в Startup.cs/ConfigureServices

services.AddMvc() 
    .AddApplicationPart(typeof(<class in external assembly>).GetTypeInfo().Assembly) 
    .AddControllersAsServices(); 

AddApplicationPart явно включает сборку в поисках контроллеров. Вызов AddControllersAsServices() добавит все обнаруженные контроллеры в коллекцию служб, и если вы поместите контрольную точку после этой строки и проверите «сервисы», вы увидите в коллекции все найденные типы контроллеров.

Вы также можете проверить здесь: https://docs.asp.net/en/latest/migration/rc1-to-rtm.html#asp-net-5-mvc-compile-views, поскольку правила обнаружения теперь изменены для контроллеров с RC1.

Также не забудьте использовать IActionResult вместо ActionResult!

+6

Для меня используется только '.AddApplicationPart (typeof (). Сборка) 'было достаточно. Вместо этого вы можете использовать другую строку: '.AddApplicationPart (Assembly.Load (« ExternalAssemblyName »));' – Learner

+1

Должно быть, теперь дизайн будет ужасным, если вы включите это после факта. – Ciantic

+0

Выполнено то же, но не получается – DanilGholtsman