Итак, на высоком уровне я понимаю концепцию внедрения зависимостей. Наша компания хочет принять эту практику, и я думаю, что это хорошая идея, но мне нужна дополнительная информация и несколько вопросов.
Что такое хороший или самый популярный контейнер для инъекций зависимостей? Я слышал о ninject, хорошо ли это работает с .NET 4 Webforms? Есть ли у Microsoft собственный DI-контейнер, который может быть лучше?
Наша структура приложения выглядит следующим образом:
- Решение
- Проект пользовательского интерфейса (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()
или что-то в этом роде? Я немного потерян.
Дайте мне знать, если мне нужно что-то прояснить. Спасибо.