Uffman Ответов: 2

Asp.net ядро webapi и web в отдельных проектах в одном решении


Я хочу иметь 2 проекта в своем решении.
Один из них предназначен для WebAPI, а другой-для front-end WEB aka. Угловой. Я не хочу иметь логику контроллера в веб-проекте, просто один для вызова URL-адресов проекта WebAPI. Можно ли это сделать? Как мне нужно настроить веб-проект, чтобы при запуске веб-сайта URL-адреса WEBAPI работали.

Что я уже пробовал:

Читайте о ссылке на WEPAPI как HTTPClient, но не знаю, правильный ли это путь, потому что у меня все еще есть классы контроллеров в моих веб-проектах.

2 Ответов

Рейтинг:
17

Thomas Nielsen - getCore

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

GlobalConfiguration.Configuration.Services.Replace(typeof(IAssembliesResolver), new AuxAssemblyResolver());


Таким образом, по сути, вы будете выводить из стандартного IAssembliesResolver и добавлять свои материалы в пользовательскую загрузку везде, где вы разместили свое определение.

public class AuxAssemblyResolver : IAssembliesResolver
    {
        public ICollection<Assembly> GetAssemblies()
        {
            List<Assembly> baseAssemblies = AppDomain.CurrentDomain.GetAssemblies().ToList();
            //Type controllerType = typeof(Business.Payments.Stripe.SubscriptionController);            
            //var controllersAssembly =  Assembly.LoadFrom(controllerType.Assembly.Location);
            //baseAssemblies.Add(controllersAssembly);
            return baseAssemblies;
        }
    }

Я сам сделал что-то подобное, когда недавно сделал контроллер подписки, который я хотел получить из проекта MVC, забавно то, что сборка для загрузки в моем случае бизнес-сборка, обрабатывающая платежи, фактически получает двойную загрузку, Если вы включаете код для ее активной загрузки ... идите разберитесь, но таким образом, загружая любые домены, которые appdomain удается подобрать внешне определенной сборке, предположительно потому, что проект ссылается на нее.

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

В принципе, фактическая загрузка сборки-это то, что должно сделать класс доступным для создания экземпляра, поэтому я оставил код do-good прокомментированным в себе, но раскомментирование его создает двусмысленность, и поскольку этот бит затем работал, я в конце концов решил, что это не моя ветряная мельница, чтобы победить, вот почему.

Надеюсь, это поможет


Uffman

Видел вот это, tnx. Но этот проект имеет контроллер - это тот же самый проект, что и угловой код. Что бы я хотел, так это иметь API-контроллеры в отдельном проекте.
Пример:

SampleApp.Основной
SampleApp.Инфраструктура
SampleApp.Услуги
SampleApp.WebApi -> этот проект имеет всю логику для контроллеров WeAPI
SampleApp.Angular -> этот проект имеет только угловой код

Как я могу вызвать/использовать контроллер SampleApp.WebApi в проекте SampleApp.Angular

Thomas Nielsen - getCore

Я обновил решение для общих внешних контроллеров, в этом случае web api 2 не имеет разницы с .net core, которую я еще не нашел, кроме большего количества вещей, работающих с места в карьер. Судя по вашему описанию, это та же самая проблема, с которой я столкнулся.

Рейтинг:
11

Uffman

Томас, спасибо. Нашел другое решение.
Мне нужно было настроить AssemblyLoad в Startup.cs

public void ConfigureServices(IServiceCollection services)
{
    var controllerAssembly = Assembly.Load(new AssemblyName("DriveTogether.WebApi"));
    services.AddMvc().AddApplicationPart(controllerAssembly).AddControllersAsServices();
}

Затем удалить маршрут от настроить метод и добавить:
app.UseMvcWithDefaultRoute();

затем вы можете вызвать API Controller с помощью этих функций
http://localhost/{ControllerName}/{метод}
http://localhost/Values/Get" --> обратите внимание, что в URL-адресе нет "api"


Thomas Nielsen - getCore

Да, это так! startup.cs-это наиболее распространенное имя класса 'application_start' в .net core

Mobin.seven

В проекте Blazor это выглядит следующим образом:

var assembly = typeof(Department).Assembly;
services.AddControllers().AddControllersAsServices()                .PartManager.ApplicationParts.Add(new AssemblyPart(assembly));