Ищите эквивалентные функции Виндзорского замка в Autofac - PullRequest
0 голосов
/ 25 марта 2011

Я был контейнером IoC Виндзорского замка последние 3 года;Я пытаюсь собрать подтверждение концепции, используя Autofac, и у меня возникают проблемы с поиском эквивалентных функций Виндзорского замка в Autofac.

• В IWinsorContainer API Виндзорского замка есть метод Release, который позволяет немедленно освободить экземпляр компонента.,Есть ли эквивалентный метод в контейнере Autofac?

• В Виндзорском замке есть концепция «объединенного» образа жизни, см. Ссылку ниже.Есть ли эквивалент в Autofac?http://www.castleproject.org/container/documentation/trunk/manual/coretypedocs/Generated_PooledAttribute.html

• DynamicProxy Виндзорского замка предоставляет способ перехвата метода.Я нашел ссылку ниже и следовал инструкциям Николаса, но я не могу найти интерфейс IInterceptor в AutofacContrib.DynamicProxy2 или в исходном коде, который он упомянул.http://nblumhardt.com/archives/aop-with-autofac-and-dynamicproxy2/

Буду признателен за любую информацию, которую вы сможете предоставить!

1 Ответ

4 голосов
/ 25 марта 2011

В Autofac нет явного выпуска. Время жизни компонентов в Autofac управляется областями действия времени жизни.Возможно, ближе всего к явному освобождению объекта является использование поддержки IDisposable , присущей жизненным областям.

Скажем, у вас есть класс, реализующий IDisposable, и вы регистрируете его:

var builder = new ContainerBuilder();
builder.RegisterType<SomeComponent>().As<IMyDependency>().InstancePerLifetimeScope();
var container = builder.Build();

Если вы создаете область действия, для которой необходимо разрешить компонент, то при утилизации области действия, как и ваш компонент:

using(var lifetime = container.BeginLifetimeScope())
{
  var myThing = lifetime.Resolve<IMyDependency>();
  // myThing.Dispose() gets called at the end of the using
}

В качестве альтернативы вы можете посмотреть на принадлежащих экземпляров , где вы контролируете, когда вызывается IDisposable.Dispose ().

Нет эквивалента времени жизни пула в Autofac. У вас есть выбор...

  • Per Dependency: создайте новый экземпляр при каждом разрешении компонента.
  • Per Lifetime Scope: создайте новый экземпляр один раз для каждой собственной области действия (как вы видели ввышеприведенный пример).
  • Одиночный экземпляр: просто создайте его.

В вики-статье есть статья о доступных для жизни областях .

Вы, вероятно, могли бы сделать несколько пользовательских кодов, чтобы заставить работать пул, включая создание собственной реализации IComponentLifetime и расширения IRegistrationBuilder, чтобы вы могли сделать что-то вроде ...

builder.RegisterType<Foo>().As<IFoo>().PooledLifetime(32);

... но яне думайте, что это будет одна или две строки.Если вы в конечном итоге создадите его, рассмотрите возможность добавления обратно в AutofacContrib.

Интерфейс IInterceptor находится в Castle.Core.dll - Castle.DynamicProxy.IInterceptor, а не в AutofacContrib.DynamicProxy2.

...