Я всегда думаю, что это легче объяснить с помощью (выдуманного) примера ...
Представьте, что у вас есть интерфейс ICustomerRepository, интерфейс IShoppingCartRepository и интерфейс ICheckout. У вас есть конкретные реализации этих интерфейсов - CustomerRepository, ShoppingCartRepository и CheckoutService.
Ваш конкретный класс CheckoutService имеет конструктор, который принимает ICustomerRepository и IShoppingCartRepository - например,
public CheckoutService(ICustomerRepository customerRepository, IShoppingCartRepository shoppingCartRepository)
{
// Set fields for use in some methods later...
_customerRepository = customerRepository;
_shoppingCartRepository = shoppingCartRepository;
}
Затем, когда вы хотите, чтобы реализация ICheckoutService выполняла некоторую работу, вы сообщаете своему контейнеру IoC, какой конкретный класс он должен использовать для каждого типа интерфейса, и просите его создать вам ICheckoutService. Ваш контейнер IoC пойдет и построит ваши классы для вас, вставляя правильные конкретные классы в конструктор вашего CheckoutService. Здесь также будут построены зависимости на всем протяжении иерархии классов, поэтому, если, например, ваш ShoppingCartRepository использует интерфейс IDatabaseSession в конструкторе, ваш контейнер IoC также внедрит эту зависимость, если вы сказали ему, какой конкретный класс использовать для вашей службы IDatabaseService.
Вот код, который вы можете использовать при настройке (например) StructureMap в качестве контейнера IoC (этот код обычно вызывается во время запуска приложения):
public class AppRegistry : Registry
{
public AppRegistry()
{
ForRequestedType<ICheckoutService>().TheDefaultIsConcreteType<CheckoutService>();
ForRequestedType<ICustomerRepository>().TheDefaultIsConcreteType<CustomerRepository>();
// etc...
}
}
Затем, чтобы получить экземпляр ICheckoutService, собранный и готовый к работе со всеми зависимостями, переданными в конструктор, вы должны использовать что-то вроде:
var checkoutService = ObjectFactory.GetInstance<ICheckoutService>();
Надеюсь, это имеет смысл!