Я нахожусь в процессе создания нового настольного приложения Windows с Prism 7, и я начал с нового базового класса PrismApplication
, который заменил загрузчик.Все было хорошо, пока я не создал (specflow-) тесты.
Я привык повторно использовать исходный загрузчик во время инициализации тестового приложения, просто изменяя регистрации после этого.То, что преобразовано в новую Application
производную систему, выглядит следующим образом:
internal partial class App
{
protected override IContainerExtension CreateContainerExtension()
{
var containerExtension = new Prism.Unity.Ioc.UnityContainerExtension();
containerExtension.Instance.AddExtension( new LogExtension() );
return containerExtension;
}
protected override Window CreateShell()
{
return Container.Resolve<MainWindow>();
}
protected override void RegisterTypes( IContainerRegistry containerRegistry )
{
containerRegistry.Register<IConfiguration, AppSettingsConfiguration>();
containerRegistry.Register<IWindowsInterface, WindowsInterface>();
// ... a lot of registrations removed here ...
}
}
И производное тестовое приложение, которое делает все, кроме создания оболочки:
private class MyApp : App
{
protected override Window CreateShell()
{
return null;
}
}
Завернуто вBeforeScenario
хук для инициализации тестового приложения:
[BeforeScenario]
public void InitializeApp()
{
var app = new MyApp();
app.Initialize();
var containerRegistry = (IContainerRegistry)app.Container;
containerRegistry.RegisterSingleton<TestWindowsInterface>();
containerRegistry.Register<IWindowsInterface,TestWindowsInterface>();
// ... some registration overrides removed here ...
_objectContainer.RegisterInstanceAs<App>( app );
}
И шаг для создания главного окна (CreateShell
замена):
[When( @"I start the software" )]
public void WhenIStartTheSoftware()
{
_container.RegisterInstanceAs( _container.Resolve<App>().Container.Resolve<MainWindowViewModel>() );
}
Пока все хорошо, это работает.Но только до тех пор, пока у вас есть только один сценарий.Как только начинается второй сценарий, мы получаем исключение:
Cannot create more than one System.Windows.Application instance in the same AppDomain.
В старые времена это не было проблемой, потому что Bootstrapper
был просто обычным классом, в отличие от PrismApplication
, который принудительно должен быть одноэлементным в фреймворке.
Конечно, я могу переместить весь материал регистрации в обычный класс и использовать его для инициализации тестового приложения, но это по сути означает создание моегособственная версия загрузчика поверх из PrismApplication
.Использование классического Bootstrapper
имеет больше смысла для меня, но оно будет удалено в будущем выпуске (так как сегодня он помечен как устаревший).