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 所做的事情上,这是一个好的开始。
首先它从容器中找到一个 IRoutePublisher
的实例并开始路由注册过程(这就是您在问题中显示的代码)。
抓取所有加载的类型(here) looking for route providers, they're classes implementing IRouteProvider
like this one。在某些时候,执行此步骤时,它会急切地从插件文件夹中加载已启用插件的程序集。注意,所有必需的程序集都需要在内存中被抓取。
为所有路由提供者调用 RegisterRoutes。
就是这样。我在我的项目中使用了一个非常相似的过程,并且效果很好。
我们尝试在我们的 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 所做的事情上,这是一个好的开始。
首先它从容器中找到一个
IRoutePublisher
的实例并开始路由注册过程(这就是您在问题中显示的代码)。抓取所有加载的类型(here) looking for route providers, they're classes implementing
IRouteProvider
like this one。在某些时候,执行此步骤时,它会急切地从插件文件夹中加载已启用插件的程序集。注意,所有必需的程序集都需要在内存中被抓取。为所有路由提供者调用 RegisterRoutes。
就是这样。我在我的项目中使用了一个非常相似的过程,并且效果很好。