Xamarin棱镜.与Unity和CSLA形成



我目前正在使用Prism和Unity作为IoC容器开发Xamarin.Forms应用程序。

我还试图将业务逻辑框架CSLA添加到我的应用程序中。

此处提供Xamarin样品:

https://github.com/MarimerLLC/csla/blob/main/Samples/XamarinExample/XamarinExample/XamarinExample/App.xaml.cs

特别是,一切似乎都是用这段代码连接起来的:

public App()
{
InitializeComponent();
var services = new ServiceCollection();
services.AddCsla();
services.AddTransient(typeof(DataAccess.IPersonDal), typeof(DataAccess.PersonDal));
serviceProvider = services.BuildServiceProvider();
ApplicationContext = serviceProvider.GetRequiredService<ApplicationContext>();
MainPage = new AppShell();
}

我正试图找出如何将这种代码/注册融入到以Unity作为IoC容器的Prism框架中。这是我需要使用扩展的时候吗?我看到了这些,但我还是有点不明白我应该做什么。

我觉得我对自己在这里应该努力实现的目标有一个根本的误解,所以任何关于我应该朝着什么方向前进的指导都是很好的。

您必须深入AddCsla()并复制在其中完成的所有注册。

剩下的很简单:

services.AddTransient(typeof(DataAccess.IPersonDal), typeof(DataAccess.PersonDal));
ApplicationContext = serviceProvider.GetRequiredService<ApplicationContext>();

翻译成Unity 是微不足道的

unityContainer.RegisterType<DataAccess.IPersonDal, DataAccess.PersonDal>();
ApplicationContext = unityContainer.Resolve<ApplicationContext>();

或Prism的";抽象层";

containerRegistry.Register<DataAccess.IPersonDal, DataAccess.PersonDal>();
ApplicationContext = containerRegistry.Resolve<ApplicationContext>();

我想这可能就是我想要的:

protected override IContainerExtension CreateContainerExtension() {
var containerExtension = base.CreateContainerExtension();

var services = new ServiceCollection();
services.AddCsla();

var serviceProvider = ((UnityContainerExtension)containerExtension).Instance.BuildServiceProvider(services);
ApplicationContext = serviceProvider.GetRequiredService<ApplicationContext>();
return containerExtension;
}

基本上,我似乎可以覆盖我的app.cs中的容器创建。从那里,我可以对ServiceCollection调用我想要的任何方法,使用扩展(在本例中为Unity(构建容器,并将容器返回到应用程序。

通过代码测试,我可以看到我现在可以将IDataPortalFactory和IServiceProvider一起注入到我的视图模型中,并且IServiceProvider的类型是Unity.Microsoft.DependencyInjection.ServiceProvider.

public MainPageViewModel(
INavigationService navigationService, 
IServiceProvider serviceProvider, 
IDataPortalFactory dataPortalFactory, 
ITestClassFactory testClassFactory)
: base(navigationService) {
Title = "Main Page";
this.serviceProvider = serviceProvider ?? throw new ArgumentNullException(nameof(serviceProvider));
this.dataPortalFactory = dataPortalFactory ?? throw new ArgumentNullException(nameof(dataPortalFactory));
this.testClassFactory = testClassFactory ?? throw new ArgumentNullException(nameof(testClassFactory));
}

因此,如果我在视图模型中获得IDataPortalFactory,我假设我对AddCsla((的调用有效,并且如果IServiceProvider被认为是Unity服务提供商,我一定已经成功地替换了service provider实现。

相关内容

  • 没有找到相关文章

最新更新