Release Notes
Simple Injector v5 is available through Nuget. For more background information about this release and a general overview, please read the blog post.
When upgrading from v4.x, please make sure you upgrade your application to the latest v4.x version of Simple Injector first. After that upgrade directly to the latest v5.2.x release.
For the release notes of the ASP.NET Core integration packages, go here.
Overview
The most prominent changes and improvements in this release are:
- #692 No more .NET 4.0. We decided to drop support for the legacy version 4.0 of the .NET Framework. Minimum supported versions are .NET 4.5 and .NET Standard 1.0.
- #557 No more first-chance exceptions. The chance of having your IDE stop at an exception that can safely be continued (a first-chance exception), are now much smaller.
- #747 Container is now automatically verified when first resolved. More information in the docs.
- #780 Unregistered concrete types are no longer resolved.
- #747 Simplified registration of disposable components. Disposables can now more easily be registered using
Lifestyle.Scoped
because Simple Injector now allowsTransient
dependencies to be injected without causing verification errors. - #820: Registration/startup performance improved. We managed make your application load faster. In extreme cases startup performance is improved up to 60%.
- #791 Asynchronous disposal.
Container
andScope
classes now implementIAsyncDisposable
to allow asynchronous disposal of components (only in .NET 4.6.1, .NET Standard 2.0, and .NET Standard 2.1 versions) - #393 Injection of metadata. In more advanced scenarios, infrastructural components can benefit from receiving additional metadata for injected components. You can now out-of-the-box inject
SimpleInjector.DependencyMetadata<TService>
into your infrastructural components to get the actual implementation type, even when that component is intercepted with decorators. This also works for collections.
Breaking changes
Below you find the complete list of all the breaking changes in the core library and all officially supported integration libraries.
Simple Injector core library
- #747 Verification is now automatically performed upon the very first call to
GetInstance()
. You will be affected if you purposely skipped verifying the container. This behavior can be disabled by settingContainer.Options.EnableAutoVerification = false;
- #694 When calling
RegisterConditional
, thePredicateContext.Consumer
property will now never return null, but instead it throws an exception. Use the newPredicateContext.HasConsumer
property instead of checking for null. You will be affected when you checkedPredicateContext.Consumer
fornull
. - #816 Verification now allows Transient components to be injected into Scoped components by default. This behavior can be disabled by setting
Container.Options.UseStrictLifestyleMismatchBehavior = true
- #393 The
where TService : class
type constraint was removed fromInstanceProducer<TService>
InstanceProducer
constructor became obsolete.- #700 Decorating container-uncontrolled collections with a singleton decorator will now throw an exception.
- #692 Removed support for .NET 4.0.
- #557
ConstructorInfo GetConstructor(Type)
method ofIConstructorResolutionBehavior
interface replaced withConstructorInfo? TryGetConstructor(Type, out string?)
method. You will be affected when you replaced the default constructor resolution behavior. - #557
void Verify(InjectionConsumerInfo)
method ofIDependencyInjectionBehavior
interface replaced withbool VerifyDependency(InjectionConsumerInfo, out string?)
method. You will be affected when you replaced the default dependency injection behavior. - #780 Unregistered concrete types will not be resolved any longer. You will be affected when your configuration depends on unregistered concrete types. This behavior can be disabled by setting
Container.Options.ResolveUnregisteredConcreteTypes = true;
. - #275
Options.EnableDynamicAssemblyCompilation
is now obsolete and replaced with a newOptions.ExpressionCompilationBehavior
. - #809 Several obsoleted methods and classes that previously caused compile errors (due to the use of the
ObsoleteAttribute
) have been removed. To prevent any problems, make sure you upgrade to the latest v4.x release first before upgrading to v5. Only upgrade to v5 after fixing all compiler warnings and errors . - #810 Several obsoleted properties, methods, and classes that where marked as obsoleted are now marked with
Obsolete(error: true)
which will cause a compiler error when used:- All
AdvancedExtensions
methods (IsLocked
,IsVerifying
,GetItem
,SetItem
,GetOrSetItem<T>
, andAppendToCollection
) Container.RegisterCollection
overloads (they have been replaced withContainer.Collection.Register
)Container.RegisterSingleton
overloads for registering already existing instances (they have been replaced withContainer.RegisterInstance
methods)Scope
's default constructor
- All
- #820:
Lifestyle
: protectedLifestyle.CreateRegistrationCore<T>(Container)
method removed. You should now inherit fromLifestyle.CreateRegistrationCore(Type, Container)
. It has the same semantics. - #820:
Registration
:Type implemenationType
andFunc<object> instanceCreator = null
parameters added toRegistration
constructor. You will be affected when you developed a custom lifestyle. - #820:
Registration
:BuildTransientDelegate<TService>(Func<TService>)
removed. You can callBuildTransientDelegate()
instead. You will be affected when you developed a custom lifestyle. - #820:
Registration
:BuildTransientExpression<TService>(Func<TService>)
removed. You can callBuildTransientExpression()
instead. You will be affected when you developed a custom lifestyle.
Packaging, WCF, Web, and Web API Integration
- #809 Several obsoleted methods and classes have been removed. To prevent any problems, make sure you upgrade to the latest v4.x release first before upgrading to v5. Only upgrade to v5 after fixing all compiler warnings and errors
API changes
Simple Injector core library
- #229
Lifestyle.Singleton.CreateRegistration(Type, object, Container)
method added for the creation ofRegistration
instances for already-created instances, including value types. - #694
PredicateContext.HasConsumer
property added to see whether there is a consumer or the type is being resolved directly from the container. - #816
Options.UseStrictLifestyleMismatchBehavior
property added that replaces the oldOptions.UseLoosenedLifestyleMismatchBehavior
. - #393
InstanceProducer.ImplementationType
property added. - #393
DependencyMetadata<TService>
class added. You can now inject aDependencyMetadata<TService>
orIEnumerable<DependencyMetadata<TService>>
into a consumer to get metadata about the injected dependency. - #791
Container
now implementsIAsyncDisposable
(only in .NET 4.6.1, .NET Standard 2.0, and .NET Standard 2.1 versions). - #791
Scope
now implementsIAsyncDisposable
(only in .NET 4.6.1, .NET Standard 2.0, and .NET Standard 2.1 versions). - #557 static
DependencyInjectionBehaviorExtensions
class added withVerify
extension method to mimic the old behavior ofIDependencyInjectionBehavior
. - #557 static
ConstructorResolutionBehaviorExtensions
class added withGetConstructor
extension method to mimic the old behavior ofIConstructorResolutionBehavior
. - #810
Container.IsLocked
property added.
API Difs
- SimpleInjector
- SimpleInjector.Integration.Wcf
- SimpleInjector.Integration.Web
- SimpleInjector.Integration.WebApi
Complete list of bugs, features and improvements
-#229 Remove the reference-type restriction from Container.RegisterConditional
and Lifestyle.CreateRegistration
- #747 Enable Automatically perform verification upon first resolve by default.
- #694 Prevent
PredicateContext.Consumer
from returning null. - #816 Make 'loosened lifestyle mismatch behavior' the default.
- #393 Allow dependency to be injected with additional metadata.
- #791 Add
IAsyncDisposable
integration usingScope.AsyncDispose
andContainer.AsyncDispose
. - #700 Drop support for decorating uncontrolled collections using a singleton decorator.
- #692 Remove support for .NET 4.0.
- #557 Prevent first-chance exceptions.
- #589 Allow the registration and resolving of ActiveX / Proxy instances.
- #780 Disable resolving concrete types by default.
- #275 Move Dynamic Assembly Compilation to different assembly.
- #820 Improve startup/configure performance by replacing.
Lifestyle.CreateRegistrationCore<T>(Container)
withLifestyle.CreateRegistrationCore(Type, Container)
. - #818 Unresolved conditional root types lead to confusing exception message
- #815 Resolving a stream collection always resolves the first instance