Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/wcf/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 解决Prism桌面应用程序中的Unity依赖关系_C#_Wcf_Mvvm_Unity Container_Prism - Fatal编程技术网

C# 解决Prism桌面应用程序中的Unity依赖关系

C# 解决Prism桌面应用程序中的Unity依赖关系,c#,wcf,mvvm,unity-container,prism,C#,Wcf,Mvvm,Unity Container,Prism,根据我在StackOverFlow上发布的前一个问题,我的Prism桌面应用程序具有以下项目结构 类库:Application.Common-->这包含我的所有DTO和在我的WCF服务层中定义的服务合约,这是一个完全不同的解决方案。 模块:Application.Modules.ServicesModule-->在这里,我使用添加服务引用添加了指向WCF实现的链接。我还注册了应用程序中定义的IMyServiceContract类型的实现。通用程序集,因此初始化方法如下所示:- public vo

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

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

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

public void Initialise()
{
   _container.RegisterType<IMyService, MyServiceClient>(new InjectionConstructor());
}
当应用程序试图在运行时解析FunctionityModule中的依赖项时,会发生以下错误

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

谢谢

亚历克斯

编辑:
由于我想使用一个公共程序集来定义我的服务契约,所以在使用添加服务引用时遇到了问题。事实证明,如果使用Add服务引用,生成的代码将使用元数据创建客户端类型。它们与公共程序集中的签名相同,但不同。为了使我能够在公共集会中使用合同,我从这篇文章中得到了灵感。这让我朝着正确的方向开始,但我认为我必须研究如何使代码更适合生产环境。

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

unityContainer.RegisterType();
您还需要指定模块依赖项。您的
功能模块
依赖于
服务模块
。如何实现这一点取决于
ModuleCatalog
的创建方式。 也是这样,;在引导程序的
CreateModuleCatalog
中使用
moduleCatalog.AddModule
,或者如果使用
DirectoryModuleCatalog
,则使用
ModuleAttribute
ModuleDependencyAttribute
装饰
iModule


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

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

using Application.Common.IMyService;

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

您确定正在加载ServicesModule吗?它是在FunctionityModule之前加载的吗?是的,如果我在ServicesModule中中断初始化,它肯定会被命中。此外,ServicesModule位于引导程序中FunctionityModule之前,因此我假设这意味着它在之前被加载。ServicesModule中的_容器实例来自何处?它是通过其构造函数注入的还是在模块中实例化的?它被注入到ServicesModule的构造函数中。行
\u container.RegisterType(IMyService,MyServiceContractClient)()显然无法编译。你能给我们看一下实际的代码,这样我们就能更好地帮助你了吗?我相信我已经添加了映射。我注意到,如果我添加ServiceReference,我必须使映射的接口端来自Application.Modules.ServicesModule,它才能工作。如果我从Application.Common获取映射的接口端,它将不起作用,这是我想要从中获取映射的地方,也是实际WCF实现中定义为我的接口的地方。
unityContainer.RegisterType < IStudentSearchService, StudentSearchService > ();
using Application.Common.IMyService;

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