我目前正在使用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实现。