据我了解,要进行单个解析调用,所有实体必须通过其依赖关系“链接在一起”。在解析根实体时,DI容器将递归地创建其余部分。 在我看到的Prism示例中,Shell窗口没有明确的依赖关系,因此当它在引导程序的CreateShell中解析时,它就会停止。因为这个模块必须在InitializeModules方法中明确解析。
同样,将视图插入shell通常是通过在模块Initialize方法中解析它们并将它们显式设置为给定区域来完成的,因此将DI容器更多地用作服务定位器。
有人知道如何将事物联系在一起以在Prism中实现单一解决吗?
答案 0 :(得分:0)
有一个应用程序有两个模块Module1和Module2。
您说以下是
public ShellView(IUnityContainer container, IRegionManager regionManager, IEventAggregator eventAggregator, IModule1 mod1, IModuel2 mod2)
{
}
比这更好
public ShellView(IUnityContainer container, IRegionManager regionManager, IEventAggregator eventAggregator)
{
}
public class IModule1 : IModule
{
public void Initialize()
{
var container = ServiceLocator.Current.GetInstance<IUnityContainer>();
var regionManager = ServiceLocator.Current.GetInstance<IRegionManager>();
regionManager.RegisterViewWithRegion("Region1", typeof(Module1View));
}
}
public class IModule2 : IModule
{
public void Initialize()
{
var container = ServiceLocator.Current.GetInstance<IUnityContainer>();
var regionManager = ServiceLocator.Current.GetInstance<IRegionManager>();
regionManager.RegisterViewWithRegion("Region2", typeof(Module2View));
}
}
人们可以通过哪种方式完成项目取决于许多因素。例如,我可以选择引用
的第二种方法<强>模块化强>
第二种方法比第一种方法更松散。第一种方法强制应用程序声明它将使用的模块。
我可以决定我的应用程序只会定义区域,稍后我会创建模块并将视图注入相应的区域。
我并不是说绝对是这种情况,因为你可以很好地选择第一种方法,因为模块本身不会有任何关于它将被使用的方法的参考,这种方法更加模块化。我所说的是有关如何解决问题的选项,限制选项通常不是一个好主意。