web-dev-qa-db-ja.com

ASP.NETコアのクラスライブラリからのAPIコントローラーの読み込みと登録

ASP.NET Core 1.0.1を使用しています。私は以下を持っています

  • コントローラーを開発するために"Microsoft.AspNetCore.Mvc": "1.0.1"を使用するクラスライブラリ:
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)
        {
        }
    }
}

これは私のクラスlibrayのproject.jsonです。

{
  "version": "1.0.0-*",

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

  "frameworks": {
    "netstandard1.6": {
      "imports": "dnxcore50"
    }
  }
}
  • コントローラをホストし、そのクラスライブラリを参照するAsp.netコアアプリケーション(Web APIテンプレート)。ただし、コントローラーのブレークポイントに到達することはありません。これが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();
        }
    }
}

コントローラが挿入されているかどうかも確認しました。

enter image description here

では、何が欠けているのでしょうか?

11
Hussein Salman

多分あなたは何か間違ったことをしている。したがって、これを機能させるための手順は次のとおりです。

  • 新しいプロジェクトを作成:ASP.NET Core Web Application(.NET Core);
  • Web APIテンプレートを選択します。
  • プロジェクトを実行し、「api/values」にアクセスして、プロジェクトが機能していることを確認します。
  • ClassLibraryという名前のソリューションに新しいプロジェクトを追加します。クラスライブラリ(.NET Core);
  • Class1.csを削除し、TestController.csクラスを作成します。
  • ClassLibraryプロジェクトのproject.jsonにMVC依存関係を追加します。

    "dependencies": {
      "NETStandard.Library": "1.6.0",
      "Microsoft.AspNetCore.Mvc": "1.0.0"
    },
    
  • TestController.csを次のように更新します。

    [Route("api/[controller]")]
    public class TestController : Controller{
      [HttpGet]
      public IEnumerable<string> Get() {
        return new string[] { "test1", "test2" };
      }
    }
    
  • WebAPIプロジェクトにClassLibraryへの参照を追加します。 "References"-> "Add Reference ..."を右クリックするか、project.jsonを次のように更新します。

    "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-*"
    },
    
  • Startup.cs ConfigureServicesメソッドを更新します。

    public void ConfigureServices(IServiceCollection services) {
      services.AddMvc().AddApplicationPart(Assembly.Load(new AssemblyName("ClassLibrary")));
    }
    
  • プロジェクトを再度実行し、「api/test」にアクセスします。
13
Fabricio Koch

メインWebアプリのStartup.csで特別なことをする必要はありません。クラスライブラリを参照するだけです。

1つのトリックは、コントローラーが検出されるためには、クラスライブラリがproject.jsonファイルの依存関係セクションでMVCを直接参照する必要があることです。

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

更新:MVCアプリの場合、スタートアップで特別なことは何も必要ありませんでしたが、私のAPIアプリの1つでは、属性ルーティングを使用しているために必要でした。

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

ここで、CSharp.WebLibはクラスライブラリの名前です。

5
Joe Audette