【问题标题】:How NopCommerce uses route tables from external plugins?NopCommerce 如何使用来自外部插件的路由表?
【发布时间】:2017-05-26 10:18:11
【问题描述】:

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

与此同时,我们找到了 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);

应该以这种方式处理插件的路由表还是可以以其他方式完成?我们希望将 Modules (Plugins) 文件夹从主 MVC 应用程序的结构中移除,并将所有模块项目放置在其中。

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

【问题讨论】:

    标签: asp.net-mvc nopcommerce


    【解决方案1】:

    我想你可以通过多种方式来做同样的事情,所以我将把我的答案集中在 nopcommerce 所做的事情上,这是一个好的开始。

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

    2. 爬取所有加载的类型 (here) 以寻找路由提供者,它们是实现 IRouteProvider 的类,如 this one。在某些时候,执行此步骤时,它会急切地从插件文件夹中加载已启用插件的程序集。请注意,所有必需的程序集都需要在内存中才能被抓取。

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

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

    【讨论】:

    • “我想有很多方法可以做到这一点”。如果您知道比 NopCommerce 中使用的方法更简单的方法,您能否推荐一下?
    • 我只是想用这个来回答你关于 nopCommerce 的问题。我想知道“更简单”的指标是什么。如果你提取并重新编码,这种技术只需要 20 行代码,包括花括号(我检查了我的代码);当然,不包括 MapRoute 子句本身。我认为这很简单。您还可以在插件中的控制器上使用Route 属性,我想这更简单。在构建插件系统时,您会发现路由并不是唯一的问题。
    • 检查docs.autofac.org/en/latest/integration/… NopCommerce 本身就是插件大师班。
    猜你喜欢
    • 2017-05-24
    • 1970-01-01
    • 1970-01-01
    • 2018-01-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-02-01
    • 2020-12-24
    相关资源
    最近更新 更多