Design of Unity

This topic describes the design goals, the architecture, and the design highlights of Unity. You do not have to understand the design to use Unity; however, this topic will help you to understand how it works and how it interacts with the underlying ObjectBuilder subsystem.

Unity was designed to achieve the following goals:

  • Promote the principles of modular design through aggressive decoupling.
  • Raise awareness of the need to maximize testability when designing applications.
  • Provide a fast and lightweight dependency injection container mechanism for creating new object instances and managing existing object instances.
  • Expose a compact and intuitive API for developers to work with the container.
  • Support a wide range of code languages, with method overrides that accept generic parameters where the language supports these.
  • Implement attribute-driven injection for constructors, property setters, and methods of target objects.
  • Provide extensibility through custom and third-party container extensions.
  • Provide the performance required in enterprise-level line of business (LOB) applications.


The public methods of the UnityContainer that developers use fall into two main categories:

  • Methods that register mappings or types. The methods RegisterType and the RegisterInstance create the appropriate entries within the current container context.
  • Methods that retrieve objects. These include overrides of the Resolve, ResolveAll, and BuildUp methods. These methods retrieve the required instances of the objects.