Prism.WPF & DryIoc, как регистрировать типы с фабрикой?

146
07 декабря 2021, 01:20

Доброго времени суток.
Возникла проблема с регистрацией типов в IContainerRegistry с фабрикой.
Могу регистрировать так:

containerRegistry.RegisterSingleton<Config>();

А нужно что-то подобное:

containerRegistry.RegisterSingleton<Config>(Config.Load);

Пробовал ставить пакеты: Prism.DryIoc.Extensions и Prism.Container.Extensions, результата ноль, только ошибка
StackTrace:

System.NotImplementedException 
  HResult=0x80004001 
  Сообщение = Метод или операция не реализована. 
  Источник = Prism.Container.Extensions 
  Трассировка стека: 
   в Prism.Ioc.IExtendedContainerRegistryExtensions.RegisterSingletonFromDelegate(IContainerRegistry containerRegistry, Type serviceType, Func`1 factoryMethod) 
   в Prism.Ioc.IExtendedContainerRegistryExtensions.RegisterSingletonFromDelegate[T](IContainerRegistry containerRegistry, Func`1 factoryMethod) 
   в Malinka.App.RegisterTypes(IContainerRegistry containerRegistry) в C:\Users\Alexandr\source\repos\Malinka\Malinka\App.xaml.cs:строка 34 
   в Prism.PrismApplicationBase.Initialize() 
   в Prism.PrismApplicationBase.InitializeInternal() 
   в Prism.PrismApplicationBase.OnStartup(StartupEventArgs e) 
   в System.Windows.Application.<.ctor>b__1_0(Object unused) 
   в System.Windows.Threading.ExceptionWrapper.InternalRealCall(Delegate callback, Object args, Int32 numArgs) 
   в System.Windows.Threading.ExceptionWrapper.TryCatchWhen(Object source, Delegate callback, Object args, Int32 numArgs, Delegate catchHandler) 
   в System.Windows.Threading.DispatcherOperation.InvokeImpl() 
   в System.Windows.Threading.DispatcherOperation.InvokeInSecurityContext(Object state) 
   в MS.Internal.CulturePreservingExecutionContext.CallbackWrapper(Object obj) 
   в System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx) 
   в System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx) 
   в System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state) 
   в MS.Internal.CulturePreservingExecutionContext.Run(CulturePreservingExecutionContext executionContext, ContextCallback callback, Object state) 
   в System.Windows.Threading.DispatcherOperation.Invoke() 
   в System.Windows.Threading.Dispatcher.ProcessQueue() 
   в System.Windows.Threading.Dispatcher.WndProcHook(IntPtr hwnd, Int32 msg, IntPtr wParam, IntPtr lParam, Boolean& handled) 
   в MS.Win32.HwndWrapper.WndProc(IntPtr hwnd, Int32 msg, IntPtr wParam, IntPtr lParam, Boolean& handled) 
   в MS.Win32.HwndSubclass.DispatcherCallbackOperation(Object o) 
   в System.Windows.Threading.ExceptionWrapper.InternalRealCall(Delegate callback, Object args, Int32 numArgs) 
   в System.Windows.Threading.ExceptionWrapper.TryCatchWhen(Object source, Delegate callback, Object args, Int32 numArgs, Delegate catchHandler) 
   в System.Windows.Threading.Dispatcher.LegacyInvokeImpl(DispatcherPriority priority, TimeSpan timeout, Delegate method, Object args, Int32 numArgs) 
   в MS.Win32.HwndSubclass.SubclassWndProc(IntPtr hwnd, Int32 msg, IntPtr wParam, IntPtr lParam) 
   в MS.Win32.UnsafeNativeMethods.DispatchMessage(MSG& msg) 
   в System.Windows.Threading.Dispatcher.PushFrameImpl(DispatcherFrame frame) 
   в System.Windows.Threading.Dispatcher.PushFrame(DispatcherFrame frame) 
   в System.Windows.Application.RunDispatcher(Object ignore) 
   в System.Windows.Application.RunInternal(Window window) 
   в System.Windows.Application.Run(Window window) 
   в System.Windows.Application.Run() 
   в Malinka.App.Main()

Так же пробовал с Prism.Unity, но выходит какой-то страшный код:

var container = containerRegistry.GetContainer();
container.RegisterFactory(typeof(Config), null, (_, __, ___) => Config.Load(), new SingletonLifetimeManager());
Answer 1

Решение:

using DryIoc;
...
protected override void RegisterTypes(IContainerRegistry containerRegistry)
{
    containerRegistry.GetContainer().RegisterDelegate(x => Config.Load(), Reuse.Singleton);
}
READ ALSO
Привязки трех вложенных списокв

Привязки трех вложенных списокв

Подскажите пожалуйста как привязать 3 вложенных списка:

161
Чем выполнить JS?

Чем выполнить JS?

Средствами POST запроса, от сервера приходит объект JSON

85
Декодирование URL

Декодирование URL

Нужно декодировать URL

108
Как получить информацию о свободном месте на диске сервера в локальной сети?

Как получить информацию о свободном месте на диске сервера в локальной сети?

Есть какой-то способ получить информацию о заполненности диска на сервере в локальной сети? Если это Windows-сервер, то можно воспользоваться...

272