ASP.NET Core MVC主项目无法在独立程序集中访问控制器

问题描述:

我想使用单独的项目来存储我的测试应用程序的控制器。由于ASP.NET Core的工作原理,您需要将services.AddMvc().AddApplicationPart与您要添加的组件联系起来。ASP.NET Core MVC主项目无法在独立程序集中访问控制器

我用的Visual Studio 2017年(所以没有更多的project.json有)

问题是我不能达到我想包括大会!

我在我的项目有补充参考:

enter image description here

另外,我决定使用填充工具对AppDomian像这样(到达组装我需要):

public class AppDomain 
    { 
     public static AppDomain CurrentDomain { get; private set; } 

     static AppDomain() 
     { 
      CurrentDomain = new AppDomain(); 
     } 

     public Assembly[] GetAssemblies() 
     { 
      var assemblies = new List<Assembly>(); 
      var dependencies = DependencyContext.Default.RuntimeLibraries; 
      foreach (var library in dependencies) 
      { 
       if (IsCandidateCompilationLibrary(library)) 
       { 
        var assembly = Assembly.Load(new AssemblyName(library.Name)); 
        assemblies.Add(assembly); 
       } 
      } 
      return assemblies.ToArray(); 
     } 

     private static bool IsCandidateCompilationLibrary(RuntimeLibrary compilationLibrary) 
     { 
      return compilationLibrary.Name == ("TrainDiary") 
       || compilationLibrary.Dependencies.Any(d => d.Name.StartsWith("TrainDiary")); 
     } 
    } 

但是,当我使用它在列表中只有一个程序集(只链接到这个项目本身,而不是一个与控制器)。

这里是我的Startup.cs

public class Startup 
    { 

     public IConfigurationRoot Configuration { get; } 
     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(); 
     } 
     // This method gets called by the runtime. Use this method to add services to the container. 
     // For more information on how to configure your application, visit https://go.microsoft.com/fwlink/?LinkID=398940 
     public void ConfigureServices(IServiceCollection services) 
     { 
      var assemblies = GetAssemblies(); // I tought I will find there Assmbly I need but no 

      services.AddSingleton<IHttpContextAccessor, HttpContextAccessor>(); 
      services.AddReact(); 
      services.AddMvc(); 
      services.AddLogging(); 
     } 

     // 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(); 

      if (env.IsDevelopment()) 
      { 
       app.UseDeveloperExceptionPage(); 
      } 

      app.UseReact(config => 
      { 
      }); 

      app.UseStaticFiles(); 
      app.UseMvcWithDefaultRoute(); 
     } 

     public List<Assembly> GetAssemblies() 
     { 
      Assembly[] assemblies = AppDomain.CurrentDomain.GetAssemblies(); 
      List<Assembly> currentAssemblies = new List<Assembly>(); 

      foreach (Assembly assembly in assemblies) 
      { 
       if (assembly.GetName().Name.Contains("TrainDiary")) 
       { 
        currentAssemblies.Add(assembly); 
       } 
      } 

      return currentAssemblies; 
     } 

    } 

我怎样才能得到我的项目也查找控制器中的其他项目?为什么不能看到它?

UPD

试图直接让想在这个exapmle这里。

所以我的代码开始看起来像这样:

var controllersAssembly = Assembly.Load(new AssemblyName("TrainDiary.Controllers")); 
services.AddMvc() 
     .AddApplicationPart(controllersAssembly) 
     .AddControllersAsServices(); 

它成功获得大会:

enter image description here

但是当我尝试打电话给控制器的功能 - 它失败!

控制器代码:

[Route("Login")] 
    public class LoginController: Controller 
    { 
     [Route("Login/Test")] 
     public void Test(string name, string password) 
     { 
      string username = name; 
      string pass = password; 
     } 
    } 

要求:

enter image description here

UPD2

出于某种原因需要删除Routes帮助:

public class LoginController: Controller 
    { 
     public void Test(string name, string password) 
     { 
      string username = name; 
      string pass = password; 
     } 
    } 

enter image description here

所以,如果和这件事:

1)您需要Add Reference您与 控制器单独的项目。

2)配置服务(部分):

public void ConfigureServices(IServiceCollection services) 
{ 
    var controllersAssembly = Assembly.Load(newAssemblyName("SomeProject.MeetTheControllers")); 

    services.AddMvc().AddApplicationPart(controllersAssembly).AddControllersAsServices(); 
} 

3)我的配置看起来像(注意UseMvcWithDefaultRoute):

// 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(); 

      if (env.IsDevelopment()) 
      { 
       app.UseDeveloperExceptionPage(); 
      } 

      app.UseReact(config => 
      { 
      }); 

      app.UseStaticFiles(); 
      app.UseMvcWithDefaultRoute(); 
     } 
在我的控制器的情况下

所以这样你不此处不需要输入Routes属性,只需拨打Some/Test url

namespace SomeProject.MeetTheControllers.Test 
{ 
    using Microsoft.AspNetCore.Mvc; 

    public class SomeController: Controller 
    { 
     public void Test(string name, string notname) 
     { 
      string username = name; 
      string nan = notname; 
     } 
    } 
}