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