0
В приведенном ниже коде очень простая демонстрация с компонентами, реализующими IDisposable
. К сожалению, ни один из деструкторов не называется. Может кто-нибудь сказать мне, почему?Почему Autofac не вызывает мой класс `` Dispose() `?
using System;
using System.Collections.Generic;
using Autofac;
namespace AutofacDemos
{
public interface ILog : IDisposable
{
void Write(string message);
}
public class ConsoleLog : ILog
{
public void Write(string message)
{
Console.WriteLine(message);
}
// needed for demonstrating ExternallyOwned()
public void Dispose()
{
Console.WriteLine("Console logger no longer required");
}
}
public class Engine
{
private readonly ILog log;
public Engine(ILog log)
{
this.log = log;
}
public void Ahead(int power)
{
log.Write($"Engine ahead {power}");
}
}
public class Car : IDisposable
{
private readonly Engine engine;
private readonly ILog log;
public Car(Engine engine)
{
this.engine = engine;
}
// constructor with most arguments used by default
public Car(Engine engine, ILog log)
{
this.engine = engine;
this.log = log;
}
public void Go()
{
engine.Ahead(100);
log.Write("Car going forward...");
}
public void Dispose()
{
log.Dispose();
}
}
internal class Program
{
public static void Main(string[] args)
{
// var log = new ConsoleLog();
// var engine = new Engine(log);
// var car = new Car(engine, log); // dependencies
var builder = new ContainerBuilder();
//builder.RegisterType<ConsoleLog>().As<ILog>();
var log = new ConsoleLog();
builder.RegisterInstance(log).As<ILog>().ExternallyOwned();
//builder.RegisterType<Engine>();
builder.RegisterType(typeof(Engine));
builder.RegisterType<Car>();
// use the engine-only constructor
//builder.RegisterType<Car>().UsingConstructor(typeof(Engine));
//builder.RegisterTypes(typeof(Car), typeof(Engine));
var container = builder.Build();
var car = container.Resolve<Car>();
using (container.BeginLifetimeScope())
{
car.Go();
}
}
}
}
Участник почти 10k должен знать, что вопрос должен быть полным без какого-либо внешнего контента. Обновите и включите код –
Кроме того, реализация 'IDisposable' и наличие деструкторов - это две разные вещи. Не могли бы вы обновить заголовок, чтобы он лучше отражал вопрос? –