2

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

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

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

nopCommerce 插件的编写方式 非常有趣,但我必须承认,对于像我这样的插件相关开发新手来说,源代码太复杂了。

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

4

1 回答 1

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].)

希望这可以帮助!

于 2015-03-23T20:21:22.513 回答