At its core, IoC, and therefore DI also, aims to offer a simpler mechanism for provisioning component dependencies (often referred to as an object's collaborators) and managing these dependencies throughout their lifecycles. A component that requires certain dependencies is often referred to as the dependent object or, in the case of IoC, the target. This is a rather grand way of saying that IoC provides services through which a component can access its dependencies and services for interacting with the dependencies throughout their life. In general, IoC can be decomposed into two subtypes: Dependency Injection and Dependency Lookup. These subtypes are further decomposed into concrete implementations of the IoC services. From this definition, you can clearly see that when we are talking about DI we are always talking about IoC, but when we are talking about IoC we are not always talking about DI.