WPF с Prism и DryIO C завершается ошибкой, когда зависимость вводит настройки IOption <> в. Net Core 3.1 - PullRequest
0 голосов
/ 13 марта 2020

Я перевожу WPF на основе Prism и DryIO C в. Net Core 3.1. Я обнаружил, что DryIO C не может обработать разрешение зависимостей, когда речь идет о функциях конфигурации ядра. net. Я пытался внедрить IOption <>, IConfiguration, et c, ничего не используя. Net Конфигурация ядра разрешится без исключения.

Я думал, что, возможно, DryIO C не был Пока не полностью совместим с Microsoft DI, но я сделал несколько попыток песочницы, которые показывают, что DryIO C работает с веб-проектами, использующими. Net Core. Я также доказал, что могу работать над проектами WPF, не используя Prism и DryIO C. У меня есть пример приложения, которое показывает проблему, которую я получаю.

Образец разрешает объект класса и пытается разрешить раздел конфигурации из файла appsettings. json в MainWindowViewModel. Мой объект класса разрешается просто отлично, но взрывается при попытке разрешить операции ввода-вывода с использованием этого кода

public MainWindowViewModel(
    IUser user
    // Comment out the next line to avoid the DI exception
    , IOptions<AppSettings> settings
)
{
    _user = user;

    // Comment out the next line to avoid the DI exception
    _settings = settings;
}

Код установки для ConfigurationBuilder выглядит следующим образом:

    public static IConfiguration Configuration { get; set; } = new ConfigurationBuilder()
        .SetBasePath(Directory.GetCurrentDirectory())
        .AddJsonFile("appsettings.json", optional: false, reloadOnChange: true)
        .AddJsonFile(
            $"appsettings.{Environment.GetEnvironmentVariable("ASPNETCORE_ENVIRONMENT") ?? "Production"}.json",
            optional: true)
        .AddEnvironmentVariables()
        .Build();

    public IHostBuilder CreateHostBuilder(string[] args) =>
        Host.CreateDefaultBuilder(args)
            .UseServiceProviderFactory(new DryIocServiceProviderFactory(container: Container.GetContainer()))
            .ConfigureServices((hostContext, services) =>
            {
                // <-- Here is where I'm using IOptions<AppSettings> dependency object -->
                services.Configure<AppSettings>(Configuration.GetSection(nameof(AppSettings)));
            })
            .ConfigureContainer<Container>((hostContext, container) =>
            {
                // <-- the debugger shows right here, the IOptions<> stuff is in the container -->
                var stuff = container.GetServiceRegistrations();
            });

        var builder = new ConfigurationBuilder()
                .SetBasePath(Directory.GetCurrentDirectory())
                .AddJsonFile("appsettings.json", optional: false, reloadOnChange: true)
            ;

        Configuration = builder.Build();

        CreateHostBuilder(args: new string[] { }).Build();

Пожалуйста, обратитесь к Пример проекта для всей установки. https://1drv.ms/u/s! AvdDo8v2RmDrjDeBRHfhkHH_kXbK? E = 37GHDF

Я получаю следующее исключение

Невозможно разрешить правила WpfPrismCore.ViewModels.MainWindowViewModelSerpeCerSerCersetSerc с помощью метода ReSecreSecureSecreC с помощью метода ResetSerpeSerseSecreC с помощью метода Reset } with Made = {FactoryMethod = ConstructorWithResolvableArguments}, где не обнаружены регистрации служб и не найдены динамические c регистрации в 0 из Rules.DynamicServiceProviders и ничего не найдено в 1 из Rules.UnknownServiceResolvers

в DryIo c .Throw .It (ошибка Int32, объект arg0, объект arg1, объект arg2, объект arg3) в D: \ Dev \ DryIoc \ src \ DryIoc \ Container.cs: строка 10684 в DryIo c .Container.TryThrowUnableToResolve (запрос запроса) в D: \ Dev \ DryIoc \ src \ DryIoc \ Container.cs: строка 939 в DryIo c .Container.DryIo c .IContainer.ResolveFactory (запрос запроса) в D: \ Dev \ DryIoc \ src \ DryIoc \ Container .cs: ​​строка 918 в DryIo c .Container.ResolveAndCacheFactoryDelegate (введите serviceType, IfUnresolved ifUnresolved) в D : \ Dev \ DryIoc \ src \ DryIoc \ Container.cs: строка 256 в DryIo c .Container.DryIo c .IResolver.Resolve (Тип serviceType, IfUnresolved ifUnresolved) в D: \ Dev \ DryIoc \ src \ DryIoc \ Container.cs: строка 230 в DryIo c .Resolver.Resolve (распознаватель IResolver, тип serviceType) в D: \ Dev \ DryIoc \ src \ DryIoc \ Container.cs: строка 5884 в Prism.DryIo c .Io * 1042. DependencyObject д, DependencyPropertyChangedEventArgs е) в системе. Windows .DependencyObject.OnPropertyChanged (DependencyPropertyChangedEventArgs е) в системе. Windows .FrameworkElement.OnPropertyChanged (DependencyPropertyChangedEventArgs е) в системе. Windows .DependencyObject.NotifyPropertyChange (DependencyPropertyChangedEventArgs арг) в системе . Windows .DependencyObject.UpdateEffecti veValue (EntryIndex entryIndex, DependencyProperty дп, PropertyMetadata метаданные, EffectiveValueEntry oldEntry, EffectiveValueEntry & newEntry, булева coerceWithDeferredReference, булева coerceWithCurrentValue, OperationType operationType) в системе. * * .DependencyObject.SetValueCommon тысяча сорок семь (DependencyProperty дп, значение объекта, PropertyMetadata метаданные, булева coerceWithDeferredReference, булева coerceWithCurrentValue, OperationType operationType, Boolean isInternal) в System. Windows .DependencyObject.SetValue (DependencyProperty dp, значение объекта) в System. Windows .Baml2006.WpfMemberInvoker.SetValue (экземпляр объекта, значение объекта в объекте) .Runtime.ClrObjectRuntime.SetValue (член XamlMember, объект obj, значение объекта) в MS.Internal.Xaml.Runtime.ClrObjectRuntime. SetValue (экземпляр объекта, свойство XamlMember, значение объекта)

...