【问题标题】:ASP.NET Core MVC main project can't reach Controllers in separate assemblyASP.NET Core MVC 主项目无法访问单独程序集中的控制器
【发布时间】:2017-08-03 08:19:31
【问题描述】:

我想使用一个单独的项目来存储我的测试应用程序的控制器。由于ASP.NET Core 的工作方式,您需要使用要添加的程序集调用services.AddMvc().AddApplicationPart。

我使用 Visual Studio 2017(所以这里不再有 project.json)

问题是我无法访问我想要包含的程序集!

我在我的项目中添加了参考:

另外,我决定像这样对 AppDomian 使用 polyfill(以达到我需要的程序集):

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

并且成功获取到程序集:

但是当我尝试调用 Controller 函数时 - 它失败了!

控制器代码:

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

请求:

UPD2:

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

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

【问题讨论】:

    标签: c# asp.net asp.net-core visual-studio-2017


    【解决方案1】:

    所以,如果总结一下:

    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;
            }
        }
    }
    

    【讨论】:

    • 值得指出的是,这种类型的工作可以很容易地外包给包含控制器的库中的扩展方法(例如,通过扩展 IMvcBuilder),可能与其他配置默认值一起(例如,注册服务,配置IViewLocationExpanders 等)。在Controller 实例位于单独程序集中的实际库中,这可能很有用,并有助于消除对额外配置的需求。
    • 它对我不起作用,因为它无法从控制器中找到视图。
    猜你喜欢
    • 2016-10-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多