Skip to content

Releases: autofac/Autofac

v9.1.0

12 Mar 21:43
a6a8c62

Choose a tag to compare

This is a pretty big release for Autofac with some major new functionality!

AnyKey Support

First, Autofac now natively supports the concept of AnyKey. It behaves the same way AnyKey works in Microsoft.Extensions.DependencyInjection, but it is native to Autofac directly. The unit tests here show some very detailed examples of usage, but on a high level:

var builder = new ContainerBuilder();
builder.RegisterType<Service>().Keyed<IService>(KeyedService.AnyKey);

var container = builder.Build();

// Registering as AnyKey allows it to respond to... any key!
var service = container.ResolveKeyed<IService>("service1");

Inject Service Key Into Constructors

The new [ServiceKey] attribute allows you to inject the service key provided during resolution. This is handy in conjunction with AnyKey. Again, this is similar to the construct in Microsoft.Extensions.DependencyInjection, but with native Autofac.

First, mark up your class to take the constructor parameter.

public class Service : IService
{
  private readonly string _id;
  public Service([ServiceKey] string id) => _id = id;
}

Then when you resolve the class, the service key will automatically be injected.

You can also make use of this in a lambda registration.

var builder = new ContainerBuilder();
builder.Register<Service>((ctx, p) => {
  var key = p.TryGetKeyedServiceKey(out string value) ? value : null;
  return new Service(key);
}).Keyed<Service>(KeyedService.AnyKey);

Metrics

Some metrics have been introduced that can allow you to capture counters on how long middleware is taking, how often lock contention occurs, and so on.

Set the AUTOFAC_METRICS environment variable in your process to true or 1 to enable this feature. You can see the set of counters that will become available here.

⚠️ This is NOT FREE. Collecting counters and metrics will incur a performance hit, so it's not something you want to leave on in production.

General Performance Improvements

A pass over the whole system was made with an eye to trying to claw back some performance. Some additional caching was introduced to help reduce lookups and calculations of reflection data; and a few hot-path optimizations were made for the common situations.

Full Changelog: v9.0.0...v9.1.0

v9.0.0

18 Nov 18:12
17ccc0b

Choose a tag to compare

Updated Autofac for .NET 10. New current set of target frameworks: net10.0;net8.0;netstandard2.1;netstandard2.0

Breaking Changes

Dropped support for net6.0, net7.0.

Additional Changes

  • Added support for net10.0.
  • Updated dependencies:
    • System.Diagnostics.DiagnosticSource 8.0.1 => 10.0.0
    • Microsoft.Bcl.AsyncInterfaces 8.0.0 => 10.0.0

Full Changelog: v8.4.0...v9.0.0

v8.4.0

04 Aug 16:54

Choose a tag to compare

Minor breaking change: The shim RequiresUnreferencedCodeAttribute has been changed from public to internal (#1462/#1463 - thanks @prochnowc!). This will only affect people targeting older/lower .NET standard frameworks who also rely on the shim attribute in Autofac. While it's technically breaking, it didn't seem like a great reason to do a full major release due to the edge case nature of the set of applications/users affected.

v8.3.0

07 May 18:29

Choose a tag to compare

What's Changed

  • Corrected nullable markup on IIndex<K,V>.TryGetValue() since it may return null on failure.
  • Composite services can now be keyed (#1458 - thanks @syko9000!)
  • Packages for core Autofac are no longer published to MyGet. Instead, builds are now available from GitHub Packages This also means the actual packages themselves won't be manually attached to the release - you can get them from the package source now.

Full Changelog: v8.2.1...v8.3.0

v8.2.1

03 Apr 14:50

Choose a tag to compare

Fix #1450: AutoActivate() no longer hides the default service registration. (Thanks, @nblumhardt!)

v8.2.0

17 Dec 19:29

Choose a tag to compare

What's Changed

  • Fix #1437: Improve type cache handling for generic type arguments with respect to AssemblyLoadContext disposal (#1438 - thanks @hemirunner426!)
  • Added overloads for RegisterServiceMiddleware to assist with interceptors/decorators (#1439 - thanks @idiotsky!)

Full Changelog: v8.1.1...v8.2.0

v8.1.1

09 Oct 16:26

Choose a tag to compare

What's Changed

  • Fix boxing in ResolveRequest.operator==() (#1430, thanks @SergeiPavlov!)
  • Remove redundant null-checking in resolution extensions (#1428, thanks @SergeiPavlov!)
  • Fix #1427: Ensure WithProperty registration methods consistently allow null values (#1428)

Full Changelog: v8.1.0...v8.1.1

v8.1.0

02 Sep 03:10

Choose a tag to compare

What's Changed

  • Optimized required member caching (#1415 - thanks @SergeiPavlov!)
  • Correctly handle polyfilled required infrastructure attributes by (#1421 - thanks @DoctorVanGogh!)
  • Improve memory management in registered services tracking (#1423 - thanks @snaumenko-st!)
  • Fix #1330: Generic decorators attached to generics that expose multiple service types should be handled properly (#1424)

Full Changelog: v8.0.0...v8.1.0

v8.0.0

16 Jan 18:19

Choose a tag to compare

Breaking Changes

  • Removed netcoreapp3.1 support/testing (#1401).
  • Converted ResolveRequest into a readonly struct (#1397 - thanks @SergeiPavlov!).

Additional Changes

  • Added net8.0 target (#1401).
  • Replaced use of Moq in tests with NSubstitute (#1390 - thanks @aydjay!).

Full Changelog: v7.1.0...v8.0.0

v7.1.0

11 Aug 14:17

Choose a tag to compare

What's Changed

  • Fix #1388: Re-enabled RegsiterTypes filtering. This was an accidental behavior regression where the RegisterTypes method wouldn't filter out non-registerable types.
  • RegisterType<T> and RegisterType(Type t) will now throw when non-registerable types are provided, for example containerBuilder.RegisterType<IInterface>() (you can't register interfaces - you can register things As<IInterface>). This used to throw at container build time; now it throws at RegisterType time and it has a more precise error message so you can handle these issues more proactively.

Full Changelog: v7.0.1...v7.1.0