2015-10-27 3 views
0

В тестовом проекте я обнаружил разрыв в производительности, когда использую последнюю версию Autofac. У меня есть класс BaseTest, который является базовым классом для всех тестов. В ctor создайте объект Autofac ContainerBuilder, зарегистрируйте все типы и т. Д.Копирование (клонирование) регистрации autofac

Затем - создайте контейнер и используйте его для локатора сервисов.

Проблема в том, - я не мог сделать контейнер статического и инициализировать его только один (а не раз в каждом тесте), чтобы сэкономить массу времени на сканирование сборок для регистрирующих типов и т.д.

Моя цель - создать статический ContainerBuilder (или Container) - где в статическом ctor BaseTest я зарегистрирую все типы, а затем в обычном ctor будет копировать этот экземпляр (со всей регистрацией) в нестационарное свойство и использовать его для ServiceLocator.

Зачем мне это нужно - потому что, например, TestA меняет/добавляет замену, или поэтому TestB ничего не знает об этой подстановке. Поэтому мне нужно очистить всю настройку регистрации после каждого тестового набора.

У вас есть идеи о том, как это сделать? Я ищу много информации в autofac - поскольку я понимаю, что невозможно скопировать или клонировать контейнер. Кроме того, я не мог сделать ContainerBuilder статическим и в обычном ctor вызовом Build() или Update, потому что он не разрешен.

Заранее спасибо.

ответ

1

Autofac не поддерживает клонирование контейнеров или регистрацию контейнеров.

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

private IContainer _container; 

[TestFixtureSetUp] 
public void TestFixtureSetUp() 
{ 
    var builder = new ContainerBuilder(); 
    // Register the common stuff, then 
    this._container = builder.Build(); 
} 

[Test] 
public void SomeTest() 
{ 
    using(var scope = this._container.BeginLifetimeScope(
    b => b.RegisterType<OverrideType>().As<IOverride>()) 
    { 
    // Resolve things from the "scope" variable rather 
    // than from the root container. 
    } 
}