相关疑难解决方法(0)

当控制器类在不同的程序集中时,如何将Controller注册到ASP.NET MVC中?

我的目标是修改asp.net mvc的控制器注册表,以便我可以在单独的(子)程序集中创建控制器和视图,只需将View文件和DLL复制到主机MVC应用程序,新控制器就可以"插入" "到主机应用程序.

显然,我需要某种IoC模式,但我很茫然.

我的想法是引用一个带有system.web.mvc的子程序集,然后开始构建继承自Controller以下内容的控制器类:

单独组装:

using System.Web;
using System.Web.Mvc;

namespace ChildApp
{
    public class ChildController : Controller
    {
        ActionResult Index()
        {
            return View();
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

可是一切都很好,花花公子.但后来我考虑修改主机应用程序的Controller注册表以在运行时加载我的新子控制器,我感到困惑.也许是因为我需要更深入地了解C#.

无论如何,我以为我需要创建一个CustomControllerFactory类.所以我开始编写一个覆盖该GetControllerInstance()方法的类.当我打字的时候,intellisence突然出现了:

主机MVC应用程序:

public class CustomControllerFactory : DefaultControllerFactory 
{
    protected override IController GetControllerInstance(System.Web.Routing.RequestContext requestContext, Type controllerType)
    {
        return base.GetControllerInstance(requestContext, controllerType);
    }
}
Run Code Online (Sandbox Code Playgroud)

现在,在这一点上,我很茫然.我不知道那是做什么的.最初,我打算写一个像这样的服务定位器的"Controller Loader"类:

主机MVC应用程序:

public class ControllerLoader
{
    public static IList<IController> Load(string folder)
    {
        IList<IController> controllers = new List<IController>();

        // Get files in folder
        string[] files …
Run Code Online (Sandbox Code Playgroud)

c# asp.net asp.net-mvc plugins inversion-of-control

27
推荐指数
1
解决办法
2万
查看次数

ASP.NET Core MVC主项目无法在单独的程序集中到达Controllers

我想使用一个单独的项目来存储我的测试应用程序的控制器.由于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") …
Run Code Online (Sandbox Code Playgroud)

c# asp.net asp.net-core visual-studio-2017

3
推荐指数
1
解决办法
3315
查看次数