Инверсия управления / внедрение зависимости с хорошим объяснением и примерами в .net? - PullRequest
5 голосов
/ 30 января 2010

Привет

Я не очень разбираюсь в платформах IoC / DI в .net Framework. Может кто-нибудь дать мне ссылки, которые подробно объясняют IoC / DI с несколькими примерами на C #? Я хочу пройти через это и получить больше представления об этих рамках.

Чтобы я мог получить знания, где и как я могу использовать эти фреймворки, полезны при реализации проекта.



NRK

Ответы [ 4 ]

12 голосов
/ 30 января 2010

Для общего знакомства с понятием DI, включая подробные примеры на C #, вы можете прочитать мою книгу Внедрение зависимостей в .NET .

2 голосов
/ 30 января 2010

Ваш лучший выбор - взглянуть на один из веб-сайтов IOC / DI

Spring.net http://www.springframework.net/

Замок Виндзор http://www.castleproject.org/container/index.html

Структура карты http://structuremap.sourceforge.net/Default.htm

Хорошие статьи по сравнению МОК

http://blog.ashmind.com/index.php/2008/08/19/comparing-net-di-ioc-frameworks-part-1/

http://www.hanselman.com/blog/ListOfNETDependencyInjectionContainersIOC.aspx

Надеюсь, это поможет. Я лично использовал Spring.Net и Castle Windsor - последний, вероятно, легче понять и использовать.

Посмотрите и на этот вопрос. Примеры контейнеров IoC

1 голос
/ 30 января 2010

Эйм Кай упомянул несколько очень хороших ресурсов по конкретным реализациям Контейнера IOC и соответствующим учебным пособиям, однако они узко сфокусированы на обсуждении Контейнера IOC и не содержат общего введения / руководства.

Лично мне нравится введение Роб Коннери написал лучше всего.

0 голосов
/ 30 января 2010

Это все о слабой связи.

Представьте, что у вас есть класс foo, зависящий от класса bar

public class Foo
{
      public Foo(Bar bar)
      {
      }
}

Здесь мы должны передать экземпляр bar в класс, чтобы создать его экземпляр. Что произойдет, если мы хотим иметь две разные реализации Bar, одну для взаимодействия с БД и одну для тестирования?

Ну, мы бы создали интерфейс IBar и использовали бы его вместо этого, тогда мы можем использовать две конкретные реализации.

Теперь рассмотрим, что у нас много сложных зависимостей во многих классах, которые вызываются во многих местах, если бы мы хотели изменить реализацию, нам пришлось бы менять код в каждом месте, где создается объект, реализующий IBar, это может быть много работы.

Вместо этого мы можем использовать инъекцию зависимости следующим образом.

IUnityContainer myContainer = new UnityContainer();
myContainer.RegisterType<IBar, Bar>();
Foo foo = myContainer.Resolve<Foo>();

Здесь платформа Unity вставила объект Bar в конструктор Foo. Если вы изменили регистрацию типов в одном месте, вы измените способ разрешения объектов Foo повсюду.

Если у вас сложные зависимости, которые могут измениться, DI необходим!

...