using System.Collections.Generic;
using Castle.MicroKernel.Registration;
using Castle.Facilities.TypedFactory;
using Microsoft.Extensions.DependencyInjection;
public static void Main()
Console.WriteLine("--- start ---");
var e = new Experiment();
Console.WriteLine("--- exit ---");
public List<(string,WeakReference)> _tracked = new ();
Action<object> _disposer;
public void UseWindsorTransient(){
var _container = new WindsorContainer().AddFacility<TypedFactoryFacility>();
_container.Register(Component.For<A>().LifestyleTransient());
_container.Register(Component.For<B>().LifestyleTransient());
_container.Register(Component.For<IBFactory>().AsFactory().LifestyleTransient());
_factory = () => _container.Resolve<A>();
_disposer = obj => _container.Release(obj);
var services = new ServiceCollection();
services.AddTransient<A>();;
services.AddTransient<Func<B>>(x => () => ActivatorUtilities.CreateInstance<B>(x) );
var provider = services.BuildServiceProvider();
_factory = () => provider.GetRequiredService<A>();
public void CheckLifeliness(){
foreach (var (name, wref) in _tracked){
Console.WriteLine($"{name} -> {wref.IsAlive}");
private void Track(string name, object obj) => Track((name, obj));
private void Track((string name, object obj) item){
_tracked.Add((item.name+"-"+item.obj.GetHashCode().ToString(), new WeakReference(item.obj)));
Console.WriteLine("--- setup ---");
Console.WriteLine("--- step ---");
Console.WriteLine("--- clear ---");
public A(IBFactory b1f, Func<B> b2f){
Console.WriteLine("Creating A");
Console.WriteLine("Destroying A");
Console.WriteLine("Disposing A");
public (string, object) CreateB1(){
public (string, object) CreateB2(){
public interface IBFactory{
Console.WriteLine("Creating B");
Console.WriteLine("Destroying B");
Console.WriteLine("Disposing B");