C# 解决Prism桌面应用程序中的Unity依赖关系
根据我在StackOverFlow上发布的前一个问题,我的Prism桌面应用程序具有以下项目结构 类库:Application.Common-->这包含我的所有DTO和在我的WCF服务层中定义的服务合约,这是一个完全不同的解决方案。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
模块: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
{
}
}