2011-04-07 55 views
1

因此,在高層次上,我理解了依賴注入的概念。我們公司希望採用這種做法,我認爲這是一個好主意,但我需要更多信息並提出一些問題。如何做ASP.NET依賴注入

  1. 什麼是良好或最流行的依賴注入容器?我聽說過ninject,這對.NET 4 Webforms有效嗎?微軟是否擁有可能更好的專有DI容器?

  2. 我們的應用程序的結構是這樣的:

    • 解決方案
      • UI項目(ASP.NET Web應用程序)
      • 業務層(類庫)
      • 數據訪問層(類庫)
    • 數據訪問層包含用於訪問數據的存儲庫類。這些存儲庫位於業務層交互的接口下。
    • 業務層具有包含通用功能的「控制器」類(不要與MVC控制器混淆)。

這裏是我們的業務層的示例控制器:

public class OrderController 
{ 
    IOrderRepository _orderRepository; 

    public OrderController(IOrderRepository orderRepository) 
    { 
     _orderRepository = orderRepository; 
    } 

    public List<string> GetFilters() 
    { 
     // Return list of filters. 
    } 

    public List<Order> GetFilteredOrders(string filter) 
    { 
     switch (filter) 
     { 
      case "Newest": 
       return // Get orders sorted by newest first. 
      case "Oldest": 
       return // Get orders sorted by oldest first. 
      default: 
       return // etc etc etc 
     } 
    } 
} 

正如你可以看到這需要的IOrderRepository注入的情況下,方便單位可測試性。 OrderController目前在需要使用它的相應頁面後面的代碼中實例化。我們不想在中創建一個新的IOrderRepository,每個我們實例化的地方OrderController,這是我們想要使用DI的地方。

實現此目的的最佳方法是什麼? DI Container在什麼時候接管並注入IOrderRepository的實例?會不會有某種工廠,所以我可以做OrderController _orderController = OrderControllerFactory.Create()或類似的東西?我有點迷路。

讓我知道我是否需要澄清一些事情。謝謝。

+0

參見這篇文章:http://bit.ly/gbEjv0。它適用於每個DI容器。 – Steven 2011-04-07 20:34:20

+0

我只有exp與Ninject。控制器結構的方式,ninject會因爲構造函數注入而很好地適應。 – 2011-04-07 20:35:00

+0

感謝您的文章。現在閱讀。 – Chev 2011-04-07 20:55:19

回答

4

我的首選是堅持使用Microsoft堆棧並使用Unity;儘管我有一些使用Ninject的同事喜歡它。

這裏是我做這個確切的事情在一個Web應用程序(MVC應用程序就是稍微有點複雜):

using Microsoft.Practices.Unity; 

public class OrderController 
{ 
    IOrderRepository _orderRepository; 

    [InjectionConstructor] 
    public OrderController(IOrderRepository orderRepository) 
    { 
     _orderRepository = orderRepository; 
    } 

    public List<string> GetFilters() 
    { 
     // Return list of filters. 
    } 

    public List<Order> GetFilteredOrders(string filter) 
    { 
     switch (filter) 
     { 
      case "Newest": 
       return // Get orders sorted by newest first. 
      case "Oldest": 
       return // Get orders sorted by oldest first. 
      default: 
       return // etc etc etc 
     } 
    } 
} 


/// 
/// From Global.asax.cs 

using Microsoft.Practices.Unity; 

private void ConfigureUnity() 
{   
    // Create UnityContainer   
    IUnityContainer container = new UnityContainer() 
    .RegisterInstance(new OrderController()) 
    .RegisterType<IOrderRepository, OrderRepository>(); 

    // Set container for use in Web Forms 
    WebUnityContainer.Container = container; 
}  

/// 
/// Creating the OrderController from your Web UI 

public OrderController CreateOrderController() 
{ 
    return WebUnityContainer.Container.Resolve<OrderController>(); 
} 

/// 
/// Shared static class for the Unity container 

using Microsoft.Practices.Unity; 

namespace MyCompany.MyApplication.Web 
{ 
    public static class WebUnityContainer 
    { 
     public static IUnityContainer Container { get; set; } 
    } 
} 
+0

你能澄清你包含的代碼的後半部分嗎?所以'ConfigureUnity()'方法進入global.asax.cs,'CreateOrderController()'和'WebUnityContainer'去哪裏? 'ConfigureUnity()'被調用到什麼地方?另外,'.RegisterInstance(new OrderController())'不會被編譯,因爲OrderController沒有一個構造函數,它的參數爲零。 – Chev 2011-04-07 21:59:00

+0

WebUnityContainer類可以添加到您的業務模塊,因爲Web類和您的域類都需要訪問。在你的Application_Start()方法中的Global.asax.cs中調用ConfigureUnity()。 – Winger 2011-04-07 22:10:16

+1

哎呀,我的壞。嘗試像這樣註冊OrderController:.RegisterType (),當您在UnityContainer上調用Resolve()時,它會使用具有最多參數的構造函數創建對象,並解析傳遞給該構造函數的每個接口的依賴關係。 – Winger 2011-04-07 22:12:29

0

使用結構圖在這裏。

http://structuremap.net/structuremap/

在構造圖是這樣的:

ObjectFactory.GetInstance(Of OrderController) 

約結構地圖尼斯鏈接:

http://weblogs.asp.net/shijuvarghese/archive/2008/10/10/asp-net-mvc-tip-dependency-injection-with-structuremap.aspx

Which .NET Dependency Injection frameworks are worth looking into?

開源應用程序:

用途團結,另一個很好的依賴注入框架:http://kigg.codeplex.com/

我1〜2年前有同樣的問題,我一直在使用StructureMap從那時起,我很喜歡它,但我知道其他框架,如Ninject和StructureMap一樣好。