如何做ASP.. NET依赖注入

本文关键字:依赖 注入 NET ASP 何做 | 更新日期: 2023-09-27 17:49:14

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

  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容器接管并注入IOrderRepository的实例?会有工厂让我做OrderController _orderController = OrderControllerFactory.Create()之类的东西吗?我有点迷路了。

如果我需要澄清什么,请告诉我。谢谢你。

如何做ASP.. NET依赖注入

我的偏好是坚持使用微软堆栈和使用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; }
    }
}

此处使用结构映射

http://structuremap.net/structuremap/

在结构映射中是这样的:

ObjectFactory.GetInstance(Of OrderController)

关于Structure Map的链接:

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

哪些。net依赖注入框架值得研究?

开源应用:

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

1~2年前我有同样的问题,从那以后我一直在使用StructureMap,我很高兴,但我知道其他框架,如Ninject,和StructureMap一样好。