MVC4可扩展插件架构

时间:2013-11-03 18:23:28

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

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

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

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

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

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

1 个答案:

答案 0 :(得分: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
    {
    }
    
  5. (请注意,具体控制器具有[RoutePrefix]。)

    希望这有帮助!