解决Prism Desktop应用程序中的Unity依赖关系

本文关键字:Unity 依赖 关系 Prism Desktop 应用程序 解决 | 更新日期: 2023-09-27 18:24:03

继我之前在StackOverFlow上发布的一个问题之后,我的Prism桌面应用程序有了以下项目结构。

类库Application.Common-->它包含我的所有DTO和在我的WCF服务层中定义的服务契约,这是一个完全不同的解决方案

模块: Application.Modules.ServicesModule-->在这里,我使用"添加服务引用"添加了指向WCF实现的链接。我还注册了我的类型的实现IMyServiceContract是在Application.Common程序集中定义的,因此初始化方法如下所示:-

public void Initialise()
{
   _container.RegisterType<IMyService, MyServiceClient>(new InjectionConstructor());
}

最后,我有另一个模块Application.Modules.FuncialityModule它有一个定义如下的构造函数

   public FunctionalityModule(IMyService myService){}

当应用程序试图在运行时解决FunctionalityModule中的依赖关系时,会发生以下错误

Exception occurred while: while resolving.
Exception is: InvalidOperationException - The current type, AccountsSln.Common.ServiceContract.IMyService, is an interface and cannot be constructed. Are you missing a type mapping?

通常,我看到这个错误是因为依赖项尚未注册,但在这种情况下,我知道它在ServicesModule中。这和注册在不同的模块中有关吗?关于如何在Prism桌面应用程序中实现我的项目结构以支持WCF服务,还有其他建议吗?

感谢

Alex

编辑:由于我想使用通用程序集来定义我的服务契约,所以在使用"添加服务引用"时遇到了问题。事实证明,如果使用"添加服务引用",生成的代码将使用元数据创建客户端类型。这些签名与公共程序集中的签名相同,但不同。为了使我能够在Common assembly中使用合同,我从这篇帖子中获得了灵感http://xaml.geek.nz/working-slightly-smarter-with-wcf.这让我朝着正确的方向开始,但我认为我必须考虑让代码更适合生产环境。

解决Prism Desktop应用程序中的Unity依赖关系

问题是您没有指定从接口到实现类型的所需映射。(我更喜欢使用UnityContainerExtensions)。

unityContainer.RegisterType < IStudentSearchService, StudentSearchService > ();

您还需要指定模块相关性。您的FunctionalityModule依赖于ServicesModule。如何实现这一点取决于如何创建ModuleCatalog。也一样;在引导程序的CreateModuleCatalog中使用moduleCatalog.AddModule,或者如果使用DirectoryModuleCatalog则用ModuleAttributeModuleDependencyAttribute装饰IModules

当然,UnityContainer可以通过app.config文件进行配置。

生成的服务代理类是分部类。您可以通过在服务引用所在的项目中添加以下内容,使它们从Common程序集中的IMyService继承:

using Application.Common.IMyService;
namespace Application.Modules.ServicesModule
{
    public partial class MyServiceClient : Application.Common.IMyService
    {
    }
}