【问题标题】:MVC4 extendable plug-in architectureMVC4 可扩展插件架构
【发布时间】:2013-11-03 18:23:28
【问题描述】:

我正在尝试创建一个可以使用插件进行扩展的基本 MVC4 应用程序,因此该应用程序的未来开发人员不必弄乱它的源代码。 从(部分)视图到数据访问和 api 控制器的扩展。

目标是开发人员必须能够创建单独的插件项目,构建项目,然后将适当的文件放入插件文件夹,而无需重新构建基础应用程序。 插件文件夹将存储在应用程序的根目录中,并包含每个插件的文件夹,即; web.presentation.statistics.chart1web.api.products.failrate

我看过几个主题,例如; MEF、OSGi.NET、MVC 领域、mvccontrib 等以及许多文章和博客,但它们要么已经过时,要么不符合我的要求。

nopCommerce plug-ins are written 的方式很有趣,但我必须承认源代码对于像我这样的人来说太复杂了,对所有插件相关的开发都是新手。

我希望你能指引我正确的方向,并可能为我指出一些可以帮助我的技术或框架。 非常感激。

【问题讨论】:

  • 旁注:创建可重用架构很难。如果您想制作一个可接受的系统,请确保使用您的架构为至少 3 个不同的系统进行规划,以验证和完善所有决策。在您的情况下,您需要至少 3 个由其他人开发的完整插件(除了您创建的几个测试/演示版本),然后才能声明系统正常工作。让其他人为您未经证实的项目编写代码可能是个问题 - 提前准备/计划。

标签: c# asp.net-mvc-4 plugins architecture


【解决方案1】:

您可以查看依赖注入 (DI) 以允许您交换特定接口的实现。例如,如果您有一个IVehicle,您可以有一个CarTruckBus 注入具体实例。大多数DI 框架将允许您配置注入不同实例的规则。

关于 API 控制器,我设置了继承的 Web API 控制器。效果很好。这就是我的做法...

  1. 添加允许从子类中读取[Route] 属性的提供程序:

    public class InheritedAttributeRouteProvider : DefaultDirectRouteProvider
    {
        protected override IReadOnlyList<IDirectRouteFactory> GetActionRouteFactories(System.Web.Http.Controllers.HttpActionDescriptor actionDescriptor)
        {
            return actionDescriptor.GetCustomAttributes<IDirectRouteFactory>(inherit: true);
        }
    }
    
  2. 设置您的 HttpConfiguration 以使用此提供程序:

    HttpConfiguration config = new HttpConfiguration();
    config.MapHttpAttributeRoutes(new InheritedAttributeRouteProvider());
    
  3. 创建一个基本控制器:

    public abstract class ControllerBase : ApiController
    {
        [Route]
        public IHttpActionResult Get()
        {
            return this.Ok(this.GetType().FullName);
        }
    }
    
  4. 创建一个具体的控制器:

    [RoutePrefix("foo")]
    public class ConcreteController : ControllerBase
    {
    }
    

(注意具体控制器有[RoutePrefix]。)

希望这会有所帮助!

【讨论】:

    猜你喜欢
    • 2010-12-17
    • 2020-11-07
    • 1970-01-01
    • 2010-09-24
    • 2016-12-06
    • 2014-08-07
    • 1970-01-01
    • 2011-05-21
    • 2020-12-14
    相关资源
    最近更新 更多