Prism中的依赖注入和单一解决方案

时间:2012-02-08 09:35:23

标签: c# dependency-injection prism

据我了解,要进行单个解析调用,所有实体必须通过其依赖关系“链接在一起”。在解析根实体时,DI容器将递归地创建其余部分。 在我看到的Prism示例中,Shell窗口没有明确的依赖关系,因此当它在引导程序的CreateShell中解析时,它就会停止。因为这个模块必须在InitializeModules方法中明确解析。

同样,将视图插入shell通常是通过在模块Initialize方法中解析它们并将它们显式设置为给定区域来完成的,因此将DI容器更多地用作服务定位器。

有人知道如何将事物联系在一起以在Prism中实现单一解决吗?

1 个答案:

答案 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));   

  }
}

人们可以通过哪种方式完成项目取决于许多因素。例如,我可以选择引用

的第二种方法

<强>模块化

第二种方法比第一种方法更松散。第一种方法强制应用程序声明它将使用的模块。

我可以决定我的应用程序只会定义区域,稍后我会创建模块并将视图注入相应的区域。

我并不是说绝对是这种情况,因为你可以很好地选择第一种方法,因为模块本身不会有任何关于它将被使用的方法的参考,这种方法更加模块化。我所说的是有关如何解决问题的选项,限制选项通常不是一个好主意。