Как должен вести себя контейнер при его утилизации? - PullRequest
0 голосов
/ 16 октября 2011

Должно ли оно генерировать исключение, передавать разрешение своему родителю или что-то еще?

Мой любимый контейнер Autofac вызывает исключение - это единственное, что мне не нравится в этом. Я думаю, что он должен передать разрешение своему родителю, который должен решить мою проблему с этим кодом


    class LazyClass
    {
        public void DoSomething() { }
    }

    class SomeClass
    {
        public event EventHandler WatchOut = (s, ea) => { };
        public void Start()
        {
            WatchOut(this, EventArgs.Empty);
        }
    }

    class LazyInterceptor
    {
        Lazy<LazyClass> lazy;
        public LazyInterceptor(Lazy<LazyClass> lazy)
        {
            this.lazy = lazy;
        }
        public void Register(SomeClass some)
        {
            some.WatchOut += (s, ea) => lazy.Value.DoSomething();
        }
    }

    [TestMethod]
    public void LazyAndEvents()
    {
        var builder = new ContainerBuilder();
        builder.RegisterType<LazyClass>().SingleInstance();
        var container = builder.Build();

        var someClass = new SomeClass();

        using (var inner = container.BeginLifetimeScope(cb => 
            cb.RegisterType().SingleInstance()))
        {
            var interceptor = inner.Resolve();
            interceptor.Register(someClass);
        }

        someClass.Start();
    }

Я знаю три обходных пути, но все они кажутся просто неправильными

  • не утилизировать контейнер - это то, чем я сейчас занимаюсь, но это просто для того, чтобы Аутофак был счастлив
  • явная регистрация ленивых - кажется, просто неправильно, и я даже не знаю, что будет решено
  • взять на себя ответственность за распоряжение - это не так уж плохо, но я не использую объект таким образом, так что снова это выглядит как обходной путь. Кроме того, в Autofac он вводит зависимость, что не очень приятно

1 Ответ

4 голосов
/ 16 октября 2011

Весь смысл областей действия времени жизни состоит в том, чтобы управлять временем жизни содержащихся экземпляров.Опираясь на схему одноразового использования, утилизация контейнера является чистым и устоявшимся способом высвобождения ресурсов, регулируемых этим контейнером.Таким образом, при удалении всей области действия вы больше не должны зависеть от экземпляров, разрешенных из этой области действия.

Поэтому я бы сказал, что вы окончательно используете Autofac неправильным способом.Возможно, если бы вы объяснили, почему вы хотите использовать такую ​​область, мы могли бы определить правильное использование.

...