【问题标题】:With interfaces and implementations in separate assemblies, where should Unity map the two in a Prism WPF application?使用单独程序集中的接口和实现,Unity 应该在 Prism WPF 应用程序中将两者映射到哪里?
【发布时间】:2011-01-04 23:27:10
【问题描述】:

我目前正在使用带有 Unity 的 Prism 开发 WPF 应用程序。该模型的功能被分成几个类库项目。对于每一组关注点,我都有一个实现项目和一个仅由接口和枚举组成的项目。目标是能够修改或完全替换实现 dll,而不会影响或不必修改应用程序中的任何其他内容。在这种情况下,我对如何在顶级应用程序中不硬引用两者的情况下将接口注册到它们的实现有点卡住了。

我知道它们必须在某个地方一起引用,但是在引导程序的顶级应用程序中发生这种情况是否违反最佳实践?对于这个特定问题,我是否应该研究 MEF 而不是 Unity?

【问题讨论】:

  • 你能提供一个功能分开的示例模型吗?
  • 该应用程序用作脚本 UI 自动化的播放器。我有一个我写的项目,其中包含我们希望自动化的 UI 项目的界面和一个实现自动化的单独项目。基本设置如下: Scripting.ComponentModel - Scripting - UIAutomation.ComponentModel - UIAutomation - 等等。我曾考虑过 Prism 模块,但我认为这些模块更适合 UI 组合。我曾考虑使用服务层来提供状态并抽象出一些细节,但在许多情况下,这实际上不会以增加复杂性为代价增加太多价值。

标签: architecture unity-container prism mef loose-coupling


【解决方案1】:

您通常在包含实现的模块中执行此操作。 Unity 容器将在模块的构造函数中使用依赖注入提供;因此,Shell 永远不需要向接口实际注册实现。包含接口的模块通常是基础结构 DLL(而不是模块),因此可以被实现模块引用。

请注意,这符合 Prism 关于分离 DLL 之间的接口/实现的建议。他们在服务方面进行了一些深入的研究;尽管我怀疑您会找到将它们用于模型或其他对象的任何示例。

例子:

using Microsoft.Practices.Unity;
using YourInfrastructureDll;

public sealed class ModuleImplementationA : IModule
{
   private readonly IUnityContainer _container;

   public ModuleImplementationA(IUnityContainer container)
   {
      _container = container;
   }

   public void Initialize()
   { 
      // IYourInterface is defined in the Infrastructure DLL, while YourImplementationA exists in this module
      _container.RegisterType<IYourInterface, YourImplementationA>();
   }
}

这可以用另一个实现 DLL 换出:

using Microsoft.Practices.Unity;
using YourInfrastructureDll;

public sealed class ModuleImplementationB : IModule
{
   private readonly IUnityContainer _container;

   public ModuleImplementationB(IUnityContainer container)
   {
      _container = container;
   }

   public void Initialize()
   { 
      // IYourInterface is defined in the Infrastructure DLL, while YourImplementationB exists in a different module than the first
      _container.RegisterType<IYourInterface, YourImplementationB>();
   }
}

【讨论】:

  • 也许那时我对模块使用的理解是错误的。我见过的大多数注入区域管理器的例子让我相信模块更像是 UI 组合的东西。谢谢
  • 模块可以用于 UI 组合,但它们也可以用于任何东西。 Prism 的优点之一是它不会强加给您。您的数据访问层可能具有在基础架构中定义的服务,但在模块中实现(可能一个用于 Oracle,一个用于 SQL Server 等) - 同样可以应用于仅执行业务逻辑的模块。这取决于应用程序。
猜你喜欢
  • 1970-01-01
  • 2021-08-20
  • 2011-07-08
  • 1970-01-01
  • 1970-01-01
  • 2021-05-10
  • 2011-01-16
  • 1970-01-01
  • 2010-11-26
相关资源
最近更新 更多