2017-01-29 2 views
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(); 
     } 


    } 
    } 
} 
+0

Участник почти 10k должен знать, что вопрос должен быть полным без какого-либо внешнего контента. Обновите и включите код –

+0

Кроме того, реализация 'IDisposable' и наличие деструкторов - это две разные вещи. Не могли бы вы обновить заголовок, чтобы он лучше отражал вопрос? –

ответ

5

Вы должны разрешить свои услуги из сферы действия, а не из контейнера. Попробуйте следующее:

using (var scope = container.BeginLifetimeScope()) 
{ 
    var car = scope.Resolve<Car>(); 
    car.Go(); 
} 
Смежные вопросы