Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/287.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 简单注入器-寄存器收集_C#_Mvvm_Ioc Container_Simple Injector - Fatal编程技术网

C# 简单注入器-寄存器收集

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),

我使用简单的注入器来创建IoC容器。我在这里采取了一种模式:

正如我在评论上述文章时所问,我想注册INavigationPage的收藏。我是这样做的:

 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。