I am using ASP.NET Core 1.0.1. I have the following
"Microsoft.AspNetCore.Mvc": "1.0.1"
in order to develop my controllers: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) { } } }
This is my class libray's project.json:
{ "version": "1.0.0-*", "dependencies": { "Microsoft.AspNetCore.Mvc": "1.0.1", "NETStandard.Library": "1.6.0" }, "frameworks": { "netstandard1.6": { "imports": "dnxcore50" } } }
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(); } } }
I also checked if the controller was injected:
So, what is missing?
Use a . NET Core library when you want to increase the . NET API surface area your library can access, and you are okay with allowing only . NET Core applications to be compatible with your library.
Maybe you're doing something wrong. So, here are the steps to make this work.
Add the MVC dependency in the project.json from the ClassLibrary project:
"dependencies": { "NETStandard.Library": "1.6.0", "Microsoft.AspNetCore.Mvc": "1.0.0" },
Update your TestController.cs to be like this:
[Route("api/[controller]")] public class TestController : Controller{ [HttpGet] public IEnumerable<string> Get() { return new string[] { "test1", "test2" }; } }
Add the reference to ClassLibrary in your WebAPI Project: right-click on "References"->"Add Reference..." or update your project.json like this:
"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-*" },
Update your Startup.cs ConfigureServices
method:
public void ConfigureServices(IServiceCollection services) { services.AddMvc().AddApplicationPart(Assembly.Load(new AssemblyName("ClassLibrary"))); }
you don't need to do anything special in Startup.cs of the main web app, it just needs to reference the class library.
The one trick is that for your controllers to be discovered your class library must directly reference MVC in its project.json file dependencies section:
"Microsoft.AspNetCore.Mvc": "1.0.*"
UPDATE: for MVC app I did not need anything special in my Startup but in one of my api apps I did need it maybe because using attribute routing.
services.AddMvc() .AddApplicationPart(Assembly.Load(new AssemblyName("CSharp.WebLib"))) ;
where CSharp.WebLib is the name of my class library
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With