Я перевожу 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, значение объекта)