如何做ASP.NET依赖注入

时间:2011-04-07 20:31:57

标签: c# asp.net interface dependency-injection controller

所以在高层次上我理解了依赖注入的概念。我们公司希望采用这种做法,我认为这是一个好主意,但我需要更多信息并提出一些问题。

  1. 什么是好的或最受欢迎的依赖注入容器?我听说过ninject,这对.NET 4 Webforms有效吗? Microsoft是否拥有可能更好的专有DI容器?

  2. 我们的应用程序结构如下:

      • UI项目(ASP.NET Web App)
      • 业务层(类库)
      • 数据访问层(类库)
    • 数据访问层包含用于访问数据的存储库类。这些存储库位于业务层与之交互的接口下。
    • 业务层具有包含通用功能的“控制器”类(不要与MVC控制器混淆)。
  3. 以下是我们业务层的示例控制器:

    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()或类似的事情?我有点失落。

    如果我需要澄清一些事情,请告诉我。谢谢。

2 个答案:

答案 0 :(得分: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; }
    }
}

答案 1 :(得分: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?

开源应用:

使用Unity,另一个良好的依赖注入框架:http://kigg.codeplex.com/

我在1〜2年前遇到过同样的问题,从那时起我就一直在使用StructureMap,我很高兴但是我知道像Ninject这样的其他框架和StructureMap一样好。