Поток спецификаций - использование Microsoft Dependency Injection из .NET Core приводит к BoDi.ObjectContainerException - PullRequest
0 голосов
/ 02 апреля 2019

В настоящее время я пытаюсь настроить новый .NET Core Project с Speflow и подключить к нему Microsoft Dependency Injection по умолчанию.

После изучения документации и Autofac / * 1005Реализация * Ninject Я попытался реализовать свой собственный плагин RunTime "SpecFlow.MSDependencyInjection.SpecFlowPlugin".

Сейчас я изо всех сил пытаюсь разрешить специфическую инфраструктуру Specflow, такую ​​как ScenarioContext.

    public static class DependencyInjectionExtension
    {
        private static void RegisterSpecflowDependecies(IObjectContainer objectContainer, ServiceCollection serviceCollection)
        {
            serviceCollection.AddSingleton(objectContainer);

            serviceCollection.AddSingleton((x) =>
            {
                var specflowContainer = x.GetRequiredService<IObjectContainer>();
                var scenarioContext = specflowContainer.Resolve<ScenarioContext>();
                return scenarioContext;
            });

            serviceCollection.AddSingleton((x) =>
            {
                var specflowContainer = x.GetRequiredService<IObjectContainer>();
                var scenarioContext = specflowContainer.Resolve<FeatureContext>();
                return scenarioContext;
            });

            serviceCollection.AddSingleton((x) =>
            {
                var specflowContainer = x.GetRequiredService<IObjectContainer>();
                var scenarioContext = specflowContainer.Resolve<TestThreadContext>();
                return scenarioContext;
            });
        }

        [ScenarioDependencies]
        public static IServiceProvider CreateServiceCollection(IObjectContainer objectContainer)
        {
            var serviceCollection = new ServiceCollection();

            RegisterSpecflowDependecies(objectContainer, serviceCollection);

            var bindingAttributeClasses = typeof(DependencyInjectionExtension).Assembly.GetTypes()
                .Where(t => Attribute.IsDefined(t, typeof(BindingAttribute))).ToArray();

            foreach (var bindingAttributeClass in bindingAttributeClasses)
            {
                serviceCollection.AddSingleton(bindingAttributeClass);
            }

            return serviceCollection.BuildServiceProvider();
        }
    }

Когда Specflow пытается разрешить одну из моих привязок, я получаю следующее исключение:

BoDi.ObjectContainerException: 'Primitive types or structs cannot be resolved: System.String (resolution path: TechTalk.SpecFlow.ScenarioContext->TechTalk.SpecFlow.ScenarioInfo)'

Код RegisterSpecflowDependecies очень похож на Autofac реализация.Поэтому я не понимаю, почему это не работает в моей реализации.

1 Ответ

0 голосов
/ 02 апреля 2019

Похоже, что один из конструкторов имеет строковый параметр.

Вы можете заключить этот конструктор в другой класс, который либо получает параметр другим способом:

class MyWrapper : ClassThatHasAStringParameter
{
    public MyWrapper()
       : base("PARAMETER_VALUE")
    {
    }
}
...