web-dev-qa-db-fra.com

Chargement et enregistrement des contrôleurs d'API à partir de la bibliothèque de classes dans le noyau ASP.NET

J'utilise ASP.NET Core 1.0.1. J'ai le suivant

  • Une bibliothèque de classes qui utilise "Microsoft.AspNetCore.Mvc": "1.0.1" afin de développer mes contrôleurs:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Mvc;

namespace CoreAPIsLibrary.Controllers
{

    [Route("api/[controller]")]
    public class ValuesContoller : Controller
    { 
        public string Get()
        {
            return "value";
        }

        // GET api/values/5
        [HttpGet("{id}")]
        public string Get(int id)
        {
            return "value";
        }

        // POST api/values
        [HttpPost]
        public void Post([FromBody]string value)
        {
        }

        // PUT api/values/5
        [HttpPut("{id}")]
        public void Put(int id, [FromBody]string value)
        {
        }
    }
}

Voici le projet de ma classe libray.json:

{
  "version": "1.0.0-*",

  "dependencies": {
    "Microsoft.AspNetCore.Mvc": "1.0.1",
    "NETStandard.Library": "1.6.0"
  },

  "frameworks": {
    "netstandard1.6": {
      "imports": "dnxcore50"
    }
  }
}
  • Application principale Asp.net (modèle d'API Web) qui hébergera mes contrôleurs et référencera cette bibliothèque de classes. Cependant, il n'atteint jamais le point d'arrêt dans le contrôleur. Voici ma classe de démarrage dans l'application web:
  using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Hosting;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Logging;
using System.Reflection;
using CoreAPIsLibrary.Controllers;

namespace APIsHost
{
    public class Startup
    {
        public Startup(IHostingEnvironment env)
        {
            var builder = new ConfigurationBuilder()
                .SetBasePath(env.ContentRootPath)
                .AddJsonFile("appsettings.json", optional: true, reloadOnChange: true)
                .AddJsonFile($"appsettings.{env.EnvironmentName}.json", optional: true)
                .AddEnvironmentVariables();
            Configuration = builder.Build();
        }

        public IConfigurationRoot Configuration { get; }

        // This method gets called by the runtime. Use this method to add services to the container.
        public void ConfigureServices(IServiceCollection services)
        {
            services.AddMvc()
              .AddApplicationPart(typeof(ValuesContoller).GetTypeInfo().Assembly).AddControllersAsServices();
        }

        // This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
        public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
        {
            loggerFactory.AddConsole(Configuration.GetSection("Logging"));
            loggerFactory.AddDebug();

            app.UseMvc(routes =>
            {
                routes.MapRoute("default", "{controller}/{action}/{id}");
            });
            //app.UseMvc();
        }
    }
}

J'ai également vérifié si le contrôleur était injecté:

enter image description here

Alors, qu'est-ce qui manque?

11
Hussein Salman

Vous faites peut-être quelque chose de mal. Voici donc les étapes à suivre pour que cela fonctionne.

  • Créez un nouveau projet: Application Web ASP.NET Core (.NET Core);
  • Choisissez le modèle d'API Web;
  • Exécutez le projet et accédez aux "api/values" pour vous assurer qu'il fonctionne;
  • Ajoutez un nouveau projet à la solution nommée ClassLibrary: Class Library (.NET Core);
  • Supprimez le Class1.cs et créez une classe TestController.cs;
  • Ajoutez la dépendance MVC dans le project.json du projet ClassLibrary:

    "dependencies": {
      "NETStandard.Library": "1.6.0",
      "Microsoft.AspNetCore.Mvc": "1.0.0"
    },
    
  • Mettez à jour votre TestController.cs pour qu'il ressemble à ceci:

    [Route("api/[controller]")]
    public class TestController : Controller{
      [HttpGet]
      public IEnumerable<string> Get() {
        return new string[] { "test1", "test2" };
      }
    }
    
  • Ajoutez la référence à ClassLibrary dans votre projet WebAPI: faites un clic droit sur "Références" -> "Ajouter une référence ..." ou mettez à jour votre project.json comme ceci:

    "dependencies": {
      "Microsoft.NETCore.App": {
        "version": "1.0.0",
        "type": "platform"
      },
      "Microsoft.AspNetCore.Mvc": "1.0.0",
      "Microsoft.AspNetCore.Server.IISIntegration": "1.0.0",
      "Microsoft.AspNetCore.Server.Kestrel": "1.0.0",
      "Microsoft.Extensions.Configuration.EnvironmentVariables": "1.0.0",
      "Microsoft.Extensions.Configuration.FileExtensions": "1.0.0",
      "Microsoft.Extensions.Configuration.Json": "1.0.0",
      "Microsoft.Extensions.Logging": "1.0.0",
      "Microsoft.Extensions.Logging.Console": "1.0.0",
      "Microsoft.Extensions.Logging.Debug": "1.0.0",
      "Microsoft.Extensions.Options.ConfigurationExtensions": "1.0.0",
      "ClassLibrary": "1.0.0-*"
    },
    
  • Mettez à jour votre méthode Startup.cs ConfigureServices:

    public void ConfigureServices(IServiceCollection services) {
      services.AddMvc().AddApplicationPart(Assembly.Load(new AssemblyName("ClassLibrary")));
    }
    
  • Réexécutez le projet et accédez à "api/test";
13
Fabricio Koch

vous n'avez rien à faire de spécial dans Startup.cs de l'application web principale, il suffit de référencer la bibliothèque de classes.

La seule astuce est que pour que vos contrôleurs soient découverts, votre bibliothèque de classes doit référencer directement MVC dans sa section des dépendances du fichier project.json:

"Microsoft.AspNetCore.Mvc": "1.0.*"

MISE À JOUR: pour l'application MVC, je n'avais besoin de rien de spécial dans mon démarrage, mais dans l'une de mes applications api, j'en avais besoin, peut-être parce que l'utilisation du routage d'attributs.

services.AddMvc()
            .AddApplicationPart(Assembly.Load(new AssemblyName("CSharp.WebLib")))
            ;

où CSharp.WebLib est le nom de ma bibliothèque de classes

5
Joe Audette