Инверсия управления
Быстрое суммирование (в этой теме доступно больше чтения, и я настоятельно рекомендую прочитать больше) ...
Microsoft Unity из группы Enterprise Patterns and Practices - это контейнерный проект Inversion of Control, или сокращенно IoC. Точно так же, как Castle Windsor, StructureMap и т. Д. Этот тип разработки также упоминается в терминах ламена как Свободное соединение ваших компонентов.
IoC включает шаблон для внедрения зависимостей ваших объектов, в котором вы полагаетесь на внешний компонент для связывания зависимостей внутри ваших объектов.
Например, вместо того, чтобы обращаться к статическим менеджерам (которые почти невозможно провести модульное тестирование), вы создаете объект, который зависит от внешней зависимости. Давайте возьмем почтовый сервис, в котором вы хотите получить доступ к БД для получения поста.
public class PostService : IPostService
{
private IPostRepository _postRepo;
public PostService(IPostRepository postRepo)
{
_postRepo = postRepo;
}
public IList<Post> GetPosts()
{
return _postRepo.GetAllPosts().ToList();
}
}
Этот объект PostService теперь имеет внешнюю зависимость от IPostRepository. Заметьте, как не используются бетоны и классы статического менеджера? Вместо этого у вас есть слабая связь простого интерфейса - который дает вам возможность подключать все различные виды конкретных классов, которые реализуют IPostRepository.
Цель Microsoft Unity - автоматически подключить этот IPostRepository для вас. Так что вам никогда не придется беспокоиться о выполнении:
// you never have to do this with Unity
IPostRepository repo = new PostRepository();
IPostService service = new PostService(repo); // dependency injection
IList<Post> posts = service.GetPosts();
Выше показано, где вы должны реализовать два конкретных класса, PostRepository () и PostService (). Это тесно связывает ваше приложение с требованием / требованием именно этих экземпляров и делает его очень трудным для модульного тестирования.
Вместо этого вы должны использовать Unity в своей конечной точке (контроллер в MVC или код на страницах ASPX):
IUnityContainer ioc = new UnityContainer();
IPostService postService = ioc.Resolve<IPostService>();
IList<Post> posts = postService.GetPosts();
Обратите внимание, что в этом примере не используются бетоны (кроме UnityContainer и Post, очевидно)! Нет конкретных услуг и нет хранилища. Это слабосвязанное во всей красе.
Вот настоящий кикер ...
Unity (или любая инфраструктура контейнера IoC!) Будет проверять IPostService на наличие любых зависимостей. Он увидит, что он хочет (зависит) от экземпляра IPostRepository. Итак, Unity перейдет в свою карту объектов и найдет первый объект, который реализует IPostRepository, который был зарегистрирован в контейнере, и вернет его (то есть экземпляр SqlPostRepository). Это реальная сила структур IoC - возможность автоматически проверять сервисы и связывать любые зависимости.
Мне нужно закончить запись в своем блоге о сравнении UNITY против Castle против StructureMap. На самом деле я предпочитаю Castle Windsor из-за параметров его файла конфигурации и точек расширения лично.