UnityContainer.Extensions.Owned
1.1.0
dotnet add package UnityContainer.Extensions.Owned --version 1.1.0
NuGet\Install-Package UnityContainer.Extensions.Owned -Version 1.1.0
<PackageReference Include="UnityContainer.Extensions.Owned" Version="1.1.0" />
<PackageVersion Include="UnityContainer.Extensions.Owned" Version="1.1.0" />
<PackageReference Include="UnityContainer.Extensions.Owned" />
paket add UnityContainer.Extensions.Owned --version 1.1.0
#r "nuget: UnityContainer.Extensions.Owned, 1.1.0"
#:package UnityContainer.Extensions.Owned@1.1.0
#addin nuget:?package=UnityContainer.Extensions.Owned&version=1.1.0
#tool nuget:?package=UnityContainer.Extensions.Owned&version=1.1.0
UnityContainer.Extensions.Owned
Autofac-style Owned<T> for Unity Container (v5.11.x).
Owned<T> gives you deterministic disposal of resolved services and their entire dependency graph. Each Owned<T> creates an isolated scope — when you dispose it, all transient and hierarchical dependencies created within that scope are disposed with it.
Install
dotnet add package UnityContainer.Extensions.Owned
Usage
Register the extension
using Unity;
using UnityContainer.Extensions.Owned;
var container = new UnityContainer();
container.AddExtension(new OwnedExtension());
Resolve Owned<T>
container.RegisterType<IRepository, Repository>();
// Each resolve creates an isolated scope
var owned = container.Resolve<Owned<IRepository>>();
IRepository repo = owned.Value;
// Use the service...
repo.Save("some data");
// Dispose the owned scope — disposes repo and all its transient dependencies
owned.Dispose();
Inject Owned<T> as a dependency
public class MyService : IDisposable
{
private readonly Owned<IRepository> ownedRepo;
public MyService(Owned<IRepository> ownedRepo)
{
this.ownedRepo = ownedRepo;
}
public void DoWork()
{
ownedRepo.Value.Save("data");
}
public void Dispose()
{
ownedRepo.Dispose(); // Disposes the repository and its scope
}
}
Behavior
Lifetime handling
| Registration lifetime | Behavior inside Owned<T> |
|---|---|
| Transient | New instance created and disposed with scope |
| Hierarchical (per-container) | New instance per scope, disposed with scope |
Singleton (ContainerControlled) |
Shared instance, not disposed by scope |
ExternallyControlled |
Instance resolved but not disposed by scope |
Scope isolation
- Each
Owned<T>gets its own child container as its scope - Disposing
Owned<T>disposes all transient/hierarchical services resolved within that scope - Singletons are resolved from the parent and are never disposed by
Owned<T> - Nested
Owned<Owned<T>>scopes are independent — disposing outer does not cascade to inner - If resolution fails, the child container is disposed immediately (no leak)
Child container support
Owned<T> works correctly when resolved from child containers. It preserves the registration hierarchy — services registered on child containers are visible to the owned scope.
How it works
The extension registers two BuilderStrategy implementations into Unity's build pipeline:
OwnedBuildStrategy(PreCreation stage) — intercepts resolution ofOwned<T>, creates a child container, resolvesTfrom it, and wraps both inOwned<T>DisposalTrackingStrategy(PostInitialization stage) — tracksIDisposableinstances created within an owned scope so they are disposed when the scope is disposed
An OwnedScopeMarker registered on the child container is used to detect whether the current resolution is happening inside an owned scope, using Unity's BuilderContext policy lookup.
Tests
The test suite validates behavior against Autofac's Owned<T> side-by-side to ensure identical semantics. Run with:
dotnet test
License
MIT
| Product | Versions Compatible and additional computed target framework versions. |
|---|---|
| .NET | net5.0 was computed. net5.0-windows was computed. net6.0 was computed. net6.0-android was computed. net6.0-ios was computed. net6.0-maccatalyst was computed. net6.0-macos was computed. net6.0-tvos was computed. net6.0-windows was computed. net7.0 was computed. net7.0-android was computed. net7.0-ios was computed. net7.0-maccatalyst was computed. net7.0-macos was computed. net7.0-tvos was computed. net7.0-windows was computed. net8.0 was computed. net8.0-android was computed. net8.0-browser was computed. net8.0-ios was computed. net8.0-maccatalyst was computed. net8.0-macos was computed. net8.0-tvos was computed. net8.0-windows was computed. net9.0 was computed. net9.0-android was computed. net9.0-browser was computed. net9.0-ios was computed. net9.0-maccatalyst was computed. net9.0-macos was computed. net9.0-tvos was computed. net9.0-windows was computed. net10.0 is compatible. net10.0-android was computed. net10.0-browser was computed. net10.0-ios was computed. net10.0-maccatalyst was computed. net10.0-macos was computed. net10.0-tvos was computed. net10.0-windows was computed. |
| .NET Core | netcoreapp2.0 was computed. netcoreapp2.1 was computed. netcoreapp2.2 was computed. netcoreapp3.0 was computed. netcoreapp3.1 was computed. |
| .NET Standard | netstandard2.0 is compatible. netstandard2.1 was computed. |
| .NET Framework | net461 was computed. net462 was computed. net463 was computed. net47 was computed. net471 was computed. net472 was computed. net48 was computed. net481 was computed. |
| MonoAndroid | monoandroid was computed. |
| MonoMac | monomac was computed. |
| MonoTouch | monotouch was computed. |
| Tizen | tizen40 was computed. tizen60 was computed. |
| Xamarin.iOS | xamarinios was computed. |
| Xamarin.Mac | xamarinmac was computed. |
| Xamarin.TVOS | xamarintvos was computed. |
| Xamarin.WatchOS | xamarinwatchos was computed. |
NuGet packages
This package is not used by any NuGet packages.
GitHub repositories
This package is not used by any popular GitHub repositories.