2013-11-03 299 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]

希望這有助於!