如何避免由 Friend 属性引起的间接引用?
Posted
技术标签:
【中文标题】如何避免由 Friend 属性引起的间接引用?【英文标题】:How can I avoid an indirect reference caused by a Friend property? 【发布时间】:2013-11-23 14:04:20 【问题描述】:获取三个 VB.net 程序集:A、B 和 C。A 引用 B,B 引用 C,但 A 不引用 C。给定以下三个类(每个程序集中一个类):
组装A
Public Class View()
Public Property ViewModel as SomeViewModel
End Class
大会B
Public Class SomeViewModel()
'Compiler is ok with private variable _Model, doesn't complain.
Private _Model as SomeModel
Friend Sub New(Model as SomeModel)
Me._Model = Model
End Sub
'Compiler complains when Friend property is added, requiring A to directly
'reference C.
Friend ReadOnly Property UnderlyingModel as SomeModel
End Class
汇编C
Public Class SomeModel()
Public Property ModelID as Integer
End Class
本质上,Assembly C 包含一个模型 (SomeModel),它由 Assembly B 中的 SomeViewModel 包装。SomeViewModel 通过“Friend”属性将该模型暴露给 AssemblyB 中的其他类。 Assembly A 中的 View 包含 SomeViewModel,但由于 Friend 修饰符,该 View 无法访问 SomeViewModel.UnderlyingModel 属性。
鉴于此配置,VS 2010 在编译程序集 A 时会出现以下编译错误:
Error 3 Construct makes an indirect reference to project 'AssemblyC',
which contains 'AssemblyC.SomeModel'. Add a project reference to 'AssemblyC' to your
project.
有没有一种方法可以通过 Friend 修饰符公开 UnderlyingModel 属性,而无需 Assembly A 引用 Assembly C?我原以为 Friend 修饰符会使这成为可能,因为程序集 A 中的视图无法访问在程序集 C 中公开模型的属性?
【问题讨论】:
【参考方案1】:是否将属性定义为Friend
并不重要。
当编译器构建您的程序集 A 时,它会找到在程序集 B 中定义的类型。我猜您创建了一个项目引用,因此它也构建了一个程序集 B。现在,程序集 B 需要程序集 C 才能工作,没有它就无法使用您的解决方案。所以这个程序集也必须对编译器可用。我想它可以作为文件参考提供,但如果它是您自己的代码,那么在一天结束时始终如一地使用项目参考会更方便。
【讨论】:
C 被 B 引用(项目引用),所以当编译器构建 B 时,它应该构建 C。Visual Studio 要求 C 被 A 直接引用。在添加 Friend 属性之前,我有很多ViewModel (B) 中引用程序集 C 的私有变量,但编译器不会抱怨它们,只会抱怨 Friend 属性。我将更新我的代码以显示这一点。 我无法真正重现您的场景。这一切都对我有用,没有编译错误...... 实际应用当然比这里的例子复杂。在实际应用程序中,视图使用绑定源(Windows 窗体)绑定到视图模型。绑定源或 Windows 窗体设计器本身可能会发生一些有趣的事情。我会看看我是否可以仅用我的示例代码重现问题并报告。以上是关于如何避免由 Friend 属性引起的间接引用?的主要内容,如果未能解决你的问题,请参考以下文章