PRISM + Splat担任IOC

时间:2019-02-06 08:10:56

标签: prism reactiveui

以前我以前将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 :(得分:1)

从我看到的Splat来看,它是一个服务定位器,而不是实际的DI容器。就是说,您当然不限于基本的Prism实现,因为提供这些实现是为了使其易于采用和入门。在您的情况下,我可能建议的是创建自己的IContainerExtension实现并从PrismApplicationBase继承。

通过查看UnityDryIoc的实现,您可以发现在App类中确实没有多少额外的工作...还有一个类似的示例使用Grace DI Container 。请记住,自上次预览以来已添加了几个新API,并提出了一项重大更改,以使IContainerRegistry具有流畅的API。