【问题标题】:Do all methods have to be public for Caliburn.Micro to match them是否所有方法都必须公开 Caliburn.Micro 才能匹配它们
【发布时间】:2012-04-27 21:20:59
【问题描述】:

我刚开始使用 Caliburn.Micro,我注意到所有示例中的方法都是公开的。我决定通过添加一个按钮来测试它:

x:Name="CloseMainWindow"

在我的虚拟机中我添加了一个方法:

private void CloseMainWindow()
{
  TryClose();
}

当我单击按钮时,什么也没有发生,我也没有遇到断点,但是如果我将方法更改为 public,它就可以工作。 我看不出这是最好的方法。

为所有方法创建 ICommand 属性是可接受的解决方案吗?

编辑:我刚刚阅读了上面问题的答案,Caliburn.Micro 中没有也永远不会有 ICommands。所以我最初的问题仍然需要一个答案,为什么所有东西都必须在 VM 中公开,这样安全吗?

【问题讨论】:

    标签: caliburn.micro


    【解决方案1】:

    我不知道您所说的“这安全吗?”。比什么更安全?

    无论如何,Caliburn.Micro 可以被设计成允许其约定绑定到私有方法,但这有几个缺点。首先,它不能在部分信任的环境中工作,例如 Silverlight 或 XBAP 或沙盒插件。您需要完全信任才能使用 Reflection 访问私有成员,而 Caliburn.Micro 旨在能够在部分信任下运行(毕竟它确实支持 Silverlight)。

    但更大的原因是它会违反封装。这些是您打算从类外部调用的方法。 (毕竟,视图是一个单独的类;如果您在代码隐藏中自己连接它,则必须将 viewmodel 方法公开。)有一个词表示“我打算从我自己的类之外调用它" 在语言规范中,即public。如果你设置了一些从类外部调用私有方法的魔法,那么你就违反了封装和最小惊讶原则,因为这不是private 的意思。

    如果您真的希望能够绑定到私有方法,您可以自定义约定。但这会使你的代码更难理解,所以除非你能提出一个非常好的理由,否则我不会推荐它。

    【讨论】:

    • 对不起我的无知。我被教导尽可能使用私人。有人告诉我,如果您将其公开,则有人可以访问您的方法并在不希望的情况下运行它。变量也是如此,这就是您使用属性的原因。是不是我教的太严格了?我还在学习,不是吗?
    • 如果您正在编写 API,那么应该比私有方法更仔细地编写公共方法,这是真的。 (如果您正在编写 EXE,这并不是真正的问题,但对于您打算让其他人使用的 DLL 来说很重要。)您不希望 API 公开实现细节和依赖关系——例如,您不应该有一个方法如果您没有先调用其他“init”方法,则会爆炸;但你可以用私人来逃避。但是按钮单击与公共方法一样面向用户(如果不是更多),因此您最好已经隐藏这些实现细节。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-15
    • 2015-01-04
    • 2023-03-20
    • 1970-01-01
    • 2019-10-11
    相关资源
    最近更新 更多