NopCommerce 如何使用来自外部插件的路由表?

How NopCommerce uses route tables from external plugins?

我们尝试在我们的 MVC 应用程序中构建模块化架构,并使用外部 DLL 的方法,这些 DLL 实际上放置并隐藏在主应用程序的 Areas 文件夹下,但它们在解决方案中作为单独的项目可见。所有模块(插件)都有自己的区域注册文件,其中包含 MapRoute 调用的 RegisterArea 方法。它对我们有用。但是,我们对 areas/hidden 方法并不完全满意,因为它看起来像是某种解决方法。

同时,我们找到了NopCommerce项目并下载了源代码。我们已经发现代码正在从特殊文件夹加载所有插件 DLL,但我们不了解主应用程序如何使用插件中的路由表。我们发现代码程序流通过插件路由表的位置,但是当我们尝试在我们的测试应用程序中执行类似操作时,即使程序流通过我们插件的路由表,它也不起作用。

实际上,在NopCommerce应用程序的Global.asax文件中有如下代码:

    public static void RegisterRoutes(RouteCollection routes)
    {
        routes.IgnoreRoute("favicon.ico");
        routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

        //register custom routes (plugins, etc)
        var routePublisher = EngineContext.Current.Resolve<IRoutePublisher>();
        routePublisher.RegisterRoutes(routes);

        routes.MapRoute(
            "Default", // Route name
            "{controller}/{action}/{id}", // URL with parameters
            new { controller = "Home", action = "Index", id = UrlParameter.Optional },
            new[] { "Nop.Web.Controllers" }
        );
    }

在该代码中,我认为有 2 行是我所要求的,但我不确定。这是这两行:

        //register custom routes (plugins, etc)
        var routePublisher = EngineContext.Current.Resolve<IRoutePublisher>();
        routePublisher.RegisterRoutes(routes);

插件的路由表应该用那种方式处理还是可以用其他方式处理?我们希望将模块(插件)文件夹置于主 MVC 应用程序的结构之外,并将所有模块项目放在那里。

如果有人对 NopCommerce 有更多经验,he/she 可以帮助我们,那就太好了。

我想有很多方法可以做到这一点,所以我会把我的回答集中在 nopcommerce 所做的事情上,这是一个好的开始。

  1. 首先它从容器中找到一个 IRoutePublisher 的实例并开始路由注册过程(这就是您在问题中显示的代码)。

  2. 抓取所有加载的类型(here) looking for route providers, they're classes implementing IRouteProvider like this one。在某些时候,执行此步骤时,它会急切地从插件文件夹中加载已启用插件的程序集。注意,所有必需的程序集都需要在内存中被抓取。

  3. 为所有路由提供者调用 RegisterRoutes。

就是这样。我在我的项目中使用了一个非常相似的过程,并且效果很好。