Как использовать контроллер в другой сборке в ASP.NET Core 3.0? - PullRequest
0 голосов
/ 03 ноября 2019

Шаблон web-интерфейса dotnet core 3 по умолчанию предполагает, что контроллеры находятся в той же сборке, что и Startup.cs

Как узнать о контроллерах в другой сборке?

Мне лично нравится, чтобы мои решения были более многослойными и зависели только от того, от чего они зависели

MyApp.Host --> MyApp.WebApi --> MyApp.Application --> MyApp.Domain

Так что в MyApp.Host я не хочу прямой зависимости от инфраструктуры MVC (хотя язнаю, что в Dotnet Core 3 это уже неявно). Контроллеры в MyApp.WebApi

1 Ответ

0 голосов
/ 03 ноября 2019

Решение заключается в .AddApplicationPart(assembly) при добавлении контроллеров в Startup.cs.

Так что если у меня есть проект MyApp.WebApi, который зависит от пакета nuGet: Microsoft.AspNetCore.Mvc.Core (текущая версия2.2.5) со следующим контроллером:

using Microsoft.AspNetCore.Mvc;
using System.Collections.Generic;

namespace MyApp.WebApi.Controllers
{
    [ApiController]
    [Route("[controller]")]
    public class SamplesController 
        : ControllerBase
    {
        [HttpGet]
        public IEnumerable<string> Get()
        {
            var samples =
                new List<string>
                {
                    "sample1", "sample2", "sample3"
                };

            return samples;
        }
    }
}

и у меня есть Startup.cs in MyApp.Host как:

using MyApp.WebApi.Controllers;
using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Hosting;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
using System.Reflection;

namespace MyApp.Cmd.Host
{
    public class Startup
    {
        public Startup(IConfiguration configuration)
        {
            Configuration = configuration;
        }

        public IConfiguration Configuration { get; }

        public void ConfigureServices(IServiceCollection services)
        {
            var sampleAssembly = Assembly.GetAssembly(typeof(SamplesController));
            services
                .AddControllers()
                .AddApplicationPart(sampleAssembly)
                .AddControllersAsServices();
        }

        public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
        {
            if (env.IsDevelopment())
            {
                app.UseDeveloperExceptionPage();
            }

            app.UseHttpsRedirection();

            app.UseRouting();

            app.UseAuthorization();

            app.UseEndpoints(endpoints =>
            {
                endpoints.MapControllers();
            });
        }
    }
}

, тогда приложение обнаружит контроллеры в другой сборкеи я смогу получить доступ: https://localhost:5001/samples

...