C# 简单注入器-寄存器收集
我使用简单的注入器来创建IoC容器。我在这里采取了一种模式: 正如我在评论上述文章时所问,我想注册INavigationPage的收藏。我是这样做的:C# 简单注入器-寄存器收集,c#,mvvm,ioc-container,simple-injector,C#,Mvvm,Ioc Container,Simple Injector,我使用简单的注入器来创建IoC容器。我在这里采取了一种模式: 正如我在评论上述文章时所问,我想注册INavigationPage的收藏。我是这样做的: private static void RegisterNavigationPages() { Container.RegisterCollection<INavigationPage>(new [] { typeof(MainNavigationPage),
private static void RegisterNavigationPages()
{
Container.RegisterCollection<INavigationPage>(new []
{
typeof(MainNavigationPage),
typeof(SecondNavigationPage)
});
}
private static void RegisterNavigationPages()
{
Container.RegisterCollection(新[]
{
类型(主导航页),
类型(第二导航页)
});
}
在容器内,我有ViewModels和NavigationService以:
Container.Register<INavigationService, NavigationService>(Lifestyle.Singleton);
Container.Register<IMainViewModel, MainViewModel>(Lifestyle.Singleton);
Container.Register<ISecondViewModel, SecondViewModel>(Lifestyle.Singleton);
Container.Register(lifesture.Singleton);
容器。登记(生活方式。单身);
容器。登记(生活方式。单身);
这是我设置页面的DataContext的方式:
DataContext = App.Container.GetInstance<IMainViewModel>();
DataContext=App.Container.GetInstance();
一切正常,但我希望在ViewModel构造函数中使用该集合中的NavigationPages。我可以按索引来做:
public SecondViewModel(INavigationService navigationService, IEnumerable<INavigationPage> navigationPageCollection)
{
NavigationService = navigationService;
_navigationPage = (navigationPageCollection.ToList())[0];
GoToMainPageCommand = new Command(GoToMainPageAction);
}
public SecondViewModel(INavigationService navigationService,IEnumerable navigationPageCollection)
{
导航服务=导航服务;
_navigationPage=(navigationPageCollection.ToList())[0];
GoToMainPageCommand=新命令(GoToMainPageAction);
}
但这并不是一个优雅的解决方案,因为当我更改NavigationPages的顺序时,我必须更改整个应用程序中的所有索引。当我能够识别出我想在ViewModel构造函数中使用哪个导航页面时,有什么解决方案吗
我不能按typeof来做,因为NavigationPage类型在UIProject中,我不能从ViewModel项目中引用,因为循环引用依赖性。目前,
SecondViewModel
的正确性完全取决于navigationPageCollection
的顺序和填充,这使得它非常脆弱。如果您的SecondViewModel
需要一个MainNavigationPage
,那么您应该插入这个页面。不要注入集合;注入页面本身。这可能意味着MainNavigationPage
需要自己的界面,例如IMainNavigationPage
。这就消除了你现在的任何模棱两可之处。但是,与其加载一对一映射的非泛型接口(违反),不如定义一个。我有一个类似的问题,以前也解决过这个问题。在这里阅读我的博客
基本上,您需要在INavigationPage中添加一个方法或属性来标识用户,然后在SecondViewModel中添加相同的标识符。SecondViewModel构造函数只需要遍历IEnumerable并找到它需要的页面 因此,
SecondViewModel
只需要与MainNavigationPage
一起使用,还是需要通过迭代更多导航页面?目前只需要该页面,但将来可能需要更多页面。可以有几个按钮到几个不同的页面。它只是应用程序的框架。目标是大约10个带有视图模型的页面。实际上OP链接到一个SO问题,其中示例代码提供了一个导航页面。将T从已定义的Abstract类移动到接口将解决问题。不太可能,因为我无法将其注入ViewModel中,因为我无法在那里使用页面类型,所以无法在构造函数参数中执行类似操作:INavigationPage mainNavigationPage。