2017-05-26 29 views
1

我们尝试在我们的MVC应用程序中构建模块化体系结构,并将该方法与实际放置并隐藏在主应用程序的Areas文件夹下的外部DLL一起使用,但它们在解决方案中作为独立项目可见。所有模块(插件)都有自己的区域注册文件,其中包含MapRoute调用的RegisterArea方法。它适用于我们。但是,我们对这些领域/隐藏方法并不完全满意,因为它看起来像是某种解决方法。NopCommerce如何使用来自外部插件的路由表?

与此同时,我们找到了NopCommerce项目并下载了源代码。我们已经知道代码是从特殊文件夹加载所有插件DLL,但我们不明白主应用程序如何使用来自插件的路由表。我们发现代码中的程序流通过插件的路由表,但是当我们试图在我们的测试应用程序中做类似的事情时,即使程序流经过我们插件的路由表,它也不起作用。

其实,有在Global.asax文件下面的代码在NopCommerce应用:

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条线我认为是负责什么我所要求的,但我米不确定。下面是那些2线:

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

如果它关于插件路由表来实现以这种方式,也可以用另一种方式来完成?我们希望将模块(插件)文件夹放在主MVC应用程序的结构中,并将所有模块项目放在那里。

如果有人对NopCommerce有更多的经验,如果他/她可以帮助我们,那将是非常好的。

回答

1

我想有很多方法可以做同样的事情,所以我会将我的答案置于nopcommerce的行业中,这是一个良好的开端。

  1. 首先,它从容器定位的IRoutePublisher一个实例,并启动路线注册过程(这是你的问题,你显示代码)。

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

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

就这样。我为我的项目使用了一个非常类似的过程,它工作得很好。

+0

“我想有很多方法可以做同样的事情”。请问,如果您知道建议比NopCommerce中使用的更简单的方法吗? – tesicg

+1

我只是想用nopCommerce回答你的问题。我想知道“简单”的指标是什么。如果你提取和重新编码,这种技术只需花20行代码,包括花括号(我检查了我的代码);当然,不包括MapRoute子句本身。我认为这很简单。 你也可以在插件中的控制器上使用'Route'属性,我想这很简单。在构建插件系统时,您会发现路由不是唯一的问题。 –

+2

查看http://docs.autofac.org/en/latest/integration/mvc。html#使用插件程序集 \t \t NopCommerce本身是插件上的主类。 –

相关问题