根据我在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中获取灵感。这让我开始朝着正确的方向前进,但我想我必须考虑让代码更适合生产环境。
答案 0 :(得分:1)
问题是您没有指定从接口到实现类型的必需映射。 (我更喜欢使用UnityContainerExtensions
)。
unityContainer.RegisterType < IStudentSearchService, StudentSearchService > ();
您还需要指定模块依赖项。您的FunctionalityModule
取决于ServicesModule
。如何实现这取决于ModuleCatalog
的创建方式。
所以要么;在Bootstrapper的CreateModuleCatalog
中使用moduleCatalog.AddModule
,或使用IModules
ModuleAttribute
和ModuleDependencyAttribute
装饰DirectoryModuleCatalog
。
当然可以通过app.config文件配置UnityContainer
。
答案 1 :(得分:0)
生成的服务代理类是分部类。您可以通过在服务引用所在的项目中添加类似以下内容的方式,使它们从公共程序集中的IMyService
继承:
using Application.Common.IMyService;
namespace Application.Modules.ServicesModule
{
public partial class MyServiceClient : Application.Common.IMyService
{
}
}