Как сделать ASP.NET Dependency Injection - PullRequest
1 голос
/ 08 апреля 2011

Итак, на высоком уровне я понимаю концепцию внедрения зависимостей. Наша компания хочет принять эту практику, и я думаю, что это хорошая идея, но мне нужна дополнительная информация и несколько вопросов.

  1. Что такое хороший или самый популярный контейнер для инъекций зависимостей? Я слышал о ninject, хорошо ли это работает с .NET 4 Webforms? Есть ли у Microsoft собственный DI-контейнер, который может быть лучше?

  2. Наша структура приложения выглядит следующим образом:

    • Решение
      • Проект пользовательского интерфейса (ASP.NET Web App)
      • Бизнес-уровень (Библиотека классов)
      • Уровень доступа к данным (библиотека классов)
    • Уровень доступа к данным содержит классы хранилища для доступа к данным. Эти репозитории находятся под интерфейсами, с которыми взаимодействует бизнес-уровень.
    • Бизнес-уровень имеет классы «контроллера» (не путать с контроллерами 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() или что-то в этом роде? Я немного потерян.

Дайте мне знать, если мне нужно что-то прояснить. Спасибо.

Ответы [ 2 ]

4 голосов
/ 08 апреля 2011

Я предпочитаю придерживаться стека Microsoft и использовать Unity; хотя у меня есть коллеги, которые используют Ninject в проектах и ​​любят его.

Вот как я делаю эту точную вещь в веб-приложении (приложения 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 голосов
/ 08 апреля 2011

Использование Структурная карта здесь.

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

Какие платформы .NET Dependency Injection стоит изучить?

Приложение с открытым исходным кодом:

ИспользуетUnity, еще один хороший фреймворк для внедрения зависимостей: http://kigg.codeplex.com/

У меня был такой же вопрос 1-2 года назад, и с тех пор я пользуюсь StructureMap, и я доволен этим, но я знаю другие фреймворки, такие как Ninjectтак же хороши, как StructureMap.

...