【问题标题】:Dependency injection and single resolve in PrismPrism 中的依赖注入和单一解析
【发布时间】:2012-02-08 09:35:23
【问题描述】:

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

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

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

【问题讨论】:

  • 因为在引导程序中你链接了你的模块并将它们添加到你的模块目录中,shell 将创建该模块的一个新实例。因此,您可以在模块类中创建一个构造函数,并添加一个引用您的 DI 容器的接口参数。然后,使用从构造函数获得的 DI 容器的引用,在 Module 类的 Initialize 方法中初始化所有视图和内容
  • 我看到它在模块中分发视图、服务等注册的方式是可以的,因为它是在与核心实体的注册“相同的上下文”中完成的。为此,您需要 DI 容器。但是保持对 DI 容器的引用以便以后能够在 Initialize 方法中多次调用解析,这对我来说是服务定位器模式。理想情况下,为了避免这种情况,您应该在解决方案中找到的唯一解析调用应该是对象图根(Shell 或类似的东西)。

标签: c# dependency-injection prism


【解决方案1】:

有一个应用程序有两个模块 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));   

  }
}

以何种方式完成项目取决于许多因素。例如我可以选择第二种方法引用

模块化

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-10-23
    • 2013-01-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-01-21
    • 2018-07-13
    相关资源
    最近更新 更多