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

时间:2012-02-11 16:33:31

标签: c# wcf mvvm unity-container prism

根据我在StackOverFlow上发布的上一个问题,我在Prism桌面应用程序中有以下项目结构。

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

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

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

最后我有另一个模块 Application.Modules.FunctionalityModule 这个构造函数定义如下

   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服务,还有其他建议吗?

由于

亚历

修改 因为我想使用Common程序集来定义我的服务合同,所以在使用Add Service Reference时遇到了问题。事实证明,如果您使用“添加服务引用”,则生成的代码将使用元数据来创建客户端类型。它们具有与Common程序集中相同的签名,但是不同。为了让我能够使用Common程序集中的契约,我从这篇文章http://xaml.geek.nz/working-slightly-smarter-with-wcf中获取灵感。这让我开始朝着正确的方向前进,但我想我必须考虑让代码更适合生产环境。

2 个答案:

答案 0 :(得分:1)

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

unityContainer.RegisterType < IStudentSearchService, StudentSearchService > ();

您还需要指定模块依赖项。您的FunctionalityModule取决于ServicesModule。如何实现这取决于ModuleCatalog的创建方式。 所以要么;在Bootstrapper的CreateModuleCatalog中使用moduleCatalog.AddModule,或使用IModules ModuleAttributeModuleDependencyAttribute装饰DirectoryModuleCatalog

当然可以通过app.config文件配置UnityContainer

答案 1 :(得分:0)

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

using Application.Common.IMyService;

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