Release Notes
Simple Injector v3 is available through Nuget, or you can download the .zip file here. For more background information about this release and migration guidance, please read the blog post. Also see the blog post for a cheat sheet with the most prominent breaking changes.
In Simple Injector v3.0 we are breaking with the past. We removed legacy methods, considerably simplified parts of the API, and added new compelling features.
What this means is that we expect that almost every developer will have to make changes to his composition root.
Before you upgrade to v3.0, please make sure you upgrade your application to the latest 2.8 version of Simple Injector first..
Most compelling new features for this release are the addition of the RegisterConditional
method to make conditional and contextual registrations, and the addition of the Lifestyle.Scope
Container.Options.DefaultScopedLifestyle
pair to considerably simplify working with scoped lifestyles. The most prominent breaking changes are the replacement of the complete SimpleInjector.Extensions
namespace and the rename of the methods RegisterSingle
and RegisterAll
to RegisterSingleton
and RegisterCollection
.
New features and improvements for the SimpleInjector.dll
Container
class now implementsIDisposable
to allow disposing singletons. (fixes #5)- Added
RegisterDecorator<TService, TDecorator>()
methods to simplify registration of non-generic decorators (fixes #7) - Added
RegisterDecorator()
as instance methods on theContainer
class. (fixes #7) Register(Type, Type)
overloads now accept open-generic types as well. (fixes #7)- Added
Container.GetTypesToRegister
method for batch registration. This method was previously hidden deep in the SimpleInjector.Extensions namespace. (fixes #7) - Added
Container.RegisterSingleton
methods as replacement forRegisterSingle
methods. The new method name is more intuitive. (fixes #44) - Added
Container.RegisterCollection
methods as replacement forRegisterAll
. The new method name is more intuitive. (fixes #42) InstanceProducer<TService>
class added that inherits fromInstanceProducer
and adds aTService GetInstance()
method. The genericLifestyle.CreateProducer
methods return anInstanceProducer<TService>
. This simplifies the use of externally created instance producers. (fixes #39)DiagnosticResult.Severity
property added to allow differentiating between warnings and information messages. (fixes #9)RegisterCollection(Type, IEnumerable<Registration>)
now accepts open generic types as well. (fixes #22)- Added
Container.Register(Type, IEnumerable<Assembly>)
andContainer.RegisterCollection(Type, IEnumerable<Assembly>)
overloads for batch registration. (fixes #7) - Resolving variant collections is now supported for container-uncontrolled collections as well. (fixes #25)
RegisterConditional
methods added to make conditional and contextual registrations for both non-generic and
closed-generic and open-generic types. (fixes #4)- Improved the message of the Lifestyle Mismatch diagnostic warning to include the concrete type in the message. (fixes #63)
- When overriding property injection behavior, property injection can be intercepted the using the
IDependencyInjectionBehavior
in the same way as constructor parameters can. (fixes #59) Lifestyle.Scoped
property added to simplify registration of scoped lifestyles. (fixes #38)- In case of a cyclic dependency graph, the thrown exception now includes information about the graph. (fixes #68)
ScopedLifestyle
derivatives don't have to overrideLength
anymore and all scoped lifestyles will have the same length. This will make the diagnostic services to treat them as the same lifestyle.- Improved support for huge object graphs. (fixes #91)
Breaking changes for the SimpleInjector.dll
- Unregistered collections are not resolved as empty collections by default anymore. Collections need to be registered explicitly. You can fallback to the old v1/v2 behavior by calling
container.Options.ResolveUnregisteredCollections = true;
. (fixes #98) IConstructorVerificationBehavior
andIConstructorVerificationBehavior
made obsolete and replaced with a newIDependencyInjectionBehavior
abstraction that combines the two. (fixes #2)- Constructor overload
Container(ContainerOptions)
removed fromContainer
. (fixes #40) - Made
ScopedLifestyle.WhenScopeEnds
method non-virtual. (fixes #11) - Made
ScopedLifestyle.RegisterForDisposal
method non-virtual. (fixes #11) - Made
ScopedLifestyle.CreateCurrentScopeProvider
method abstract. (fixes #11) - Removed
ScopedLifestyle.DisposeInstances
method. (fixes #11) - Removed
Container.InjectProperties
method. (fixes #12) - Removed the
Container.RegisterSingle
method overloads. (fixes #44) - Removed the
Container.RegisterAll
method overloads. (fixes #42) - Moved
DecoratorPredicateContext
class to theSimpleInjector
root namespace. (fixes #7) - Moved
DecoratorContext
to theSimpleInjector
root namespace. (fixes #7) - Removed
RegisterSingleDecorator
extension methods.RegisterDecorator
can be used instead. (fixed #7) - Removed
RegisterAllOpenGeneric
extension methods.RegisterCollection
can now be used instead. (fixes #7) - Removed
RegisterOpenGeneric
andRegisterSingleOpenGeneric
extension methods.Register
can now be used instead. (fixes #7) - Renamed
OpenGenericPredicateContext
toPredicateContext
and moved it to theSimpleInjector
root namespace. (fixes #7) - Second argument of
Container.Register(Type, Type)
renamed fromimplementation
toimplementationType
. - Removed
RegisterManyForOpenGeneric
extension methods. EitherRegister
orRegisterCollection
can be used instead. (fixes #7) - Removed
OpenGenericBatchRegistrationExtensions.GetTypesToRegister
extension methods.Container.GetTypesToRegister
can be used instead. (fixes #7) - Calling
Verify()
orGetInstance
will always cause the container to check for lifestyle mismatches unlessContainer.Options.SuppressLifestyleMismatchVerification
is set. (fixes #46) - Calling
Verify()
will now standard do diagnostic analysis. Diagnostic analysis can be suppressed by calling theVerify(VerificationOption)
overload (but this is highly discouraged). (fixes #10) - Class constraint
where TService : class
added toGetAllInstances<TService>()
method. - Renamed
PotentialLifestyleMismatchDiagnosticResult
class toLifestyleMismatchDiagnosticResult
. There's nothing 'potential' about that mismatch. We're actually sure that this is a mismatch. (fixes #84) - Made
UnregisteredTypeEventArgs
constructor internal.
Breaking changes for the SimpleInjector.Extensions.LifetimeScoping.dll
- Removed the
LifetimeScope
class.Scope
can be used instead. (fixes #12) - Removed the
SimpleInjectorLifetimeScopeExtensions.EnableLifetimeScoping
method. The method has been marked obsolete since Simple Injector 2.6. (fixes #12)
Breaking changes for the SimpleInjector.Integration.Wcf.dll
- Removed the
WcfOperationScope
class.Scope
can be used instead. (fixes #12) - Removed the
SimpleInjectorWcfExtensions.EnablePerWcfOperationLifestyle
method. The method has been marked obsolete since Simple Injector 2.6. (fixes #12)
Breaking changes for the SimpleInjector.Integration.Web.dll
- Removed the
SimpleInjectorWebExtensions.RegisterForDisposal
method.WebRequestLifestyle.RegisterForDisposal
can be used instead. (fixes #12)
Breaking changes for the SimpleInjector.Integration.Web.Mvc.dll
- Removed the
SimpleInjectorMvcExtensions.RegisterMvcAttributeFilterProvider
method.RegisterMvcIntegratedFilterProvider
can be used instead. (fixes #12)
Breaking changes for the SimpleInjector.Integration.WebApi.dll
- Removed the
SimpleInjectorWebApiExtensions.RegisterWebApiFilterProvider
method. Please consult the Web API integration guide on how to inject dependencies into Web API filter attributes. (fixes #12)
Bug fixes:
- Registering a
Func<object>
usingUnregisteredTypeEventArgs.Register(Func<object>)
caused the Diagnostic system to throw aNullReferenceException
. (fixes #49) - Prevented incorrectly mixing registrations for several types of collections. (fixes #8)
- Cyclic dependency in type registered using
RegisterOpenGeneric
caused a stackoverflow. - Huge transient object graphs failed to be compiled and caused the CLR to throw a stackoverflow exception. (fixes #91)