我有MVC項目。模型,控制器&視圖都有一個自己的項目,因此3個DLL。我還有一個IFACADE,IBUSINESS & IDATALAYER接口(dlls),具體實現在FACADE,BUSINESS & DATACCESS DLLS中。 如何使用MEF將它們連接在一起?構建MVC ASP.NET應用程序,使用MEF的n層鬆散耦合
回答
我建議的是在系統中定義第一個可擴展性點,在什麼層或什麼組件允許第三方開發人員擴展或完全替代。您必須定義可擴展性的起點和結束位置。
這是在開始開發之前必須要做的設計決策。你稍後可能會改變,但它會消耗更多的時間,你將不得不做很多改變。在你定義這個之後,一切都變得容易多了。
嘗試定義契約(接口),因爲MEF中的契約取代了典型應用程序的緊密耦合。 MEF使用合同在運行時匹配導入和導出組件。
如果您有一個ex。有一些方法ProductRepository,然後創建一個包含這些方法的接口IProductRepository,然後標記ProductRepository與出口屬性是這樣的:
public interface IProductRepository
{
IEnumerable<Product> GetProducts(Expression<Func<Product, bool>> query);
}
[Export(typeof(IProductRepository))]
public class ProductRepository : IProductRepository
{
public IEnumerable<Product> GetProducts(Expression<Func<Product, bool>> query)
{
throw new NotImplementedException();
}
}
對於參數的緣故,讓我們說,你有一個服務於同類產品:
public interface IProductService
{
IEnumerable<Product> GetLatestProducts(int items);
}
[Export(typeof(IProductService))]
public class ProductService : IProductService
{
private IProductRepository _repository;
[ImportingConstructor]
public ProductService(IProductRepository repository)
{
this._repository = repository;
}
public IEnumerable<Product> GetLatestProducts(int items)
{
return _repository.GetProducts(p => p.DateCreated == DateTime.Today).OrderByDescending(p => p.DateCreated).Take(items);
}
}
通過使用Export屬性標記存儲庫,可以使服務通過MEF導入同一個存儲庫。如您所見,我們將工作委託給MEF CompositionContainer以向ProductService提供ProductRepository的實例...我們通過使用依賴注入通過構造器注入來注入此實例。
然後在你的MVC控制器應用同樣的原理,但現在你導入ProductService而不是ProductRepository ......是這樣的:
[Export(typeof(IController))]
[ExportMetadata("Name","Product")]
public class ProductController : Controller
{
private IProductService _service;
[ImportingConstructor]
public ProductController(IProductService service)
{
_service = service;
}
public ActionResult LatestProducts()
{
var model = _service.GetLatestProducts(3);
return View(model);
}
}
通過導出你的控制器,你可以把你的控制器,每當你想,在相同的組件或獨立的組件中。正如你所看到的,我已經爲控制器添加了另一個屬性[ExportMetadata(「Name」,「Product」)]。這用於在查詢時決定哪個控制器離開組合容器。
接下來你需要做的是從一些目錄:TypeCalog,DirectoryCatalog,AssemblyCatalog或AggregateCatalog創建matchmaker =>組合容器。您告訴目錄加載程序集的位置。你可以在codeplex
現在你需要一種方式來讓你的控制器脫離CompositionContainer。您可以在MVC中執行此操作的地方是ControllerFactory。您必須創建一個自定義ControllerFactory(通過繼承DefaultControllerFactory或實現IControllerFactory接口)。然後在控制器工廠內查詢組合容器,並找到請求的控制器。
正如您大概可以理解的那樣,組合過程從控制器工廠開始:ProductController導入ProductService和ProductService導入ProductRepository。 MEF組合容器遍歷依賴關係圖並滿足這些導入。
- 1. 使應用層鬆散耦合
- 2. 鬆散耦合的架構(用戶界面層到BL層)
- 3. 使用鬆散耦合的WCF Web服務的ASP.NET MVC
- 4. 如何使框架和相關應用程序鬆散耦合?
- 5. 如何使數據與應用程序代碼鬆散耦合?
- 6. 構建解耦N層應用程序,實體框架和VB.NET
- 7. Django在應用程序中鬆散耦合
- 8. Asp.net MVC是鬆散耦合,並在HTML的完全控制
- 9. asp.net MVC ddd DRY vs鬆散耦合和持久性/數據訪問層
- 10. 建模鬆散耦合域模型
- 11. 使OR或M鬆散耦合並從其他層抽象
- 12. 如何構建鬆散耦合的gradle任務屬性?
- 13. 如何鬆散地耦合.NET應用程序中的數據庫列?
- 14. 鬆散耦合的觀察者模式
- 15. MVVM:的ViewModels的鬆散耦合
- 16. 鬆散類耦合和數據訪問
- 17. 應用程序和模型繼承的鬆耦合
- 18. F中的鬆散耦合代理#
- 19. StructureMap n層應用程序
- 20. WPF中不使用棱鏡的鬆散耦合事件
- 21. ASP.NET MVC n層架構
- 22. 什麼是鬆散耦合的代碼?
- 23. 與實體框架的鬆散耦合
- 24. Azure鬆散耦合/可擴展
- 25. 緊耦合和鬆耦合
- 26. 的N層應用VS asp.net MVC僅
- 27. OOP設計 - 性能與鬆散耦合
- 28. Web應用程序可能是鬆耦合嗎?
- 29. 分離問題與鬆散耦合
- 30. Asp.net Mvc示例應用程序與N層
謝謝你的答案。你有可以分享的示例應用程序嗎?在此先感謝 – ticklewow 2011-05-26 22:18:12
訂閱此博客,在即將到來的日子裏我打算髮布類似的東西 - http://phalanx.spartansoft.org/author/m-shaqiri – 2011-05-27 00:21:23