2013-11-03 103 views
2

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

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

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

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

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

+1

附注:创建可重用架构很难。如果你想制定一个可接受的系统,请确保使用你的架构至少规划3个不同的系统来验证和抛光所有决策。在你的情况下,你至少需要其他人开发的3个全尺寸插件(除了你创建的几个测试/演示版本之外),然后才能申请系统工作。让其他人为你的未经证实的项目编写代码可能是一个问题 - 事先准备/计划它。 –

回答

1

你可以看看依赖注入(DI)来让你交换特定接口的实现。例如,如果您有IVehicle,则可以注入一个Car,TruckBus具体实例。大多数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]

希望这有助于!