ПРИЗМА + Сплат как МОК - PullRequest
       8

ПРИЗМА + Сплат как МОК

0 голосов
/ 06 февраля 2019

Ранее я уже использовал DryIOC в качестве своего IOC, но я хотел бы попробовать Splat для своего IOC, возможно ли объединить эти два?

Я пытался создать LoginModule, который наследуетIModule поэтому у меня есть это в моем LoginModule классе:

public void OnInitialized(IContainerProvider containerProvider)
{
        Locator.CurrentMutable.RegisterLazySingleton(() => new ServiceEntityMapper(), typeof(IServiceEntityMapper));
        Locator.CurrentMutable.RegisterLazySingleton(() => new LoginAPIService(), typeof(ILoginAPIService));
        Locator.CurrentMutable.RegisterLazySingleton(() => new LoginManager(
        Locator.Current.GetService<IServiceEntityMapper>(),
        Locator.Current.GetService<ILoginAPIService>()), typeof(ILoginManager));
}

, и у меня есть это для моего конструктора модели представления:

 public LoginViewModel(INavigationService navigationService, ILoginManager loginManager = null) : base(navigationService)
 {
        LoginManager = loginManager ?? Locator.Current.GetService<ILoginManager>();
 }

В результате я получаю это исключение всякий раз, когдаЯ перехожу на страницу

{System.TypeLoadException: Could not resolve the signature of a virtual method
  at System.Lazy`1[T].CreateValue () [0x00081] in <fe08c003e91342eb83df1ca48302ddbb>:0 
  at System.Lazy`1[T].LazyInitValue () [0x00080] in <fe08c003e91342eb83df1ca48302ddbb>:0 
  at System.Lazy`1[T].get_Value () [0x0003a] in <fe08c003e91342eb83df1ca48302ddbb>:0 
  at Splat.DependencyResolverMixins+<>c__DisplayClass7_0.<RegisterLazySingleton>b__0 () [0x00000] in <89c762f12a12451a8970372dc9921547>:0 
  at Splat.ModernDependencyResolver.GetService (System.Type serviceType, System.String contract) [0x00032] in <89c762f12a12451a8970372dc9921547>:0 
  at Splat.DependencyResolverMixins.GetService[T] (Splat.IDependencyResolver resolver, System.String contract)

1 Ответ

0 голосов
/ 06 февраля 2019

Из того, что я видел, Splat - это Service Locator, а не DI-контейнер.Тем не менее, вы, конечно, не ограничены базовыми реализациями Prism, так как они предоставляются, чтобы упростить адаптацию и начать работу.Что я могу предложить в вашем случае, так это создать собственную реализацию IContainerExtension и наследовать от PrismApplicationBase.

Вы можете увидеть, что на самом деле это не так уж много дополнительной работы в вашем классе приложения, если посмотреть на реализации для Unity или DryIoc ... есть аналогичный пример с использованием Grace DI-контейнера .Имейте в виду, что с момента последнего предварительного просмотра было добавлено несколько новых API-интерфейсов с предлагаемым критическим изменением, позволяющим IContainerRegistry свободно использовать API.

...