小编Kit*_*Kit的帖子

当前的MVVM视图模型是否违反了单一责任原则?

使用当前的实践(至少使用WPF和Silverlight),我们在视图模型中看到通过命令绑定绑定的视图,或者我们至少看到视图模型中处理的视图事件.这似乎违反了SRP,因为视图模型不仅模拟视图状态,而且响应视图(用户).其他人已经询问如何构建视图模型而不违反SRP或询问他们的实现是否这样做(最后是MVC中的控制器,但大致类似).

那么目前的做法是否违反了SRP?或者"视图模型"真的是一组不违反SRP的东西?为了解决这个问题,似乎我们需要知道什么是单一责任,或者如果概念中有多个责任,个别职责是否分开,符合SRP.我不确定.

维基百科对视图模型的定义

[View] ViewModel是一个"视图模型",意思是它是View的抽象,也用于视图和模型之间的数据绑定

对于SRP而言,这似乎已经足够了,但后来这篇文章说明了(我强调了)

[ViewModel]充当数据绑定器/转换器,将模型信息更改为View信息,并将命令从View传递到模型

一篇关于视图模型角色的Prism博客文章中,作者说(再次,我的重点)

它归结为视图模型是以下的组合:

  • 视图的抽象
  • 命令
  • 价值转换器
  • 查看状态

我确定我错过了许多定义,但它们似乎属于以下类别:

  1. 建模视图状态的单一"模糊"责任(所以我们的意思是什么 状态)
  2. 多重职责(查看状态,用户交互(即命令))
  3. 由单一特定职责(抽象,状态,交互,转换)组成的综合,因此具有单一责任:"管理所有这些东西".

如果你很好奇,我"关心"这个因为(2)感觉正确,但似乎与普遍的实施相反.

silverlight wpf single-responsibility-principle mvvm viewmodel

19
推荐指数
3
解决办法
2490
查看次数

XAML与代码中的不间断空间

这工作正常,并正确地将不间断的空格插入到字符串中:

<TextBlock Text="Non&#160;Breaking&#160;Text&#160;Here"></TextBlock>
Run Code Online (Sandbox Code Playgroud)

但我真正需要的是在数据绑定期间用不间断的空格替换空格.所以我写了一个简单的值转换器,用" &#160;" 替换空格.它确实用" &#160;" 替换空格,但" &#160;"字面显示而不是显示为不间断的空格.这是我的转换器:

public class SpaceToNbspConverter : IValueConverter
{
    #region IValueConverter Members

    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        return value.ToString().Replace(" ", "&#160;");
    }

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {
        throw new NotImplementedException();
    }

    #endregion
}
Run Code Online (Sandbox Code Playgroud)

有人知道它为什么在XAML中工作,但不在代码中吗?

silverlight wpf whitespace xaml silverlight-4.0

17
推荐指数
2
解决办法
8895
查看次数

Visual Studio 2022 有没有办法在命名空间之前和之后添加新行?

我正在使用 Visual Stuido 2022 来编写我的 C# 项目。

有没有一种方法可以使用(.editorconfig文件)在命名空间之前和之后添加新行来配置VS?

所以我的课程看起来像这样

using System;

namespace ProjectName.Tests;

public class Test
{
    
}

Run Code Online (Sandbox Code Playgroud)

代替

using System;
namespace ProjectName.Tests;
public class Test
{
    
}

Run Code Online (Sandbox Code Playgroud)

visual-studio visual-studio-2022

16
推荐指数
1
解决办法
1928
查看次数

"Enum as immutable rich-object":这是一种反模式吗?

我经常看到并使用带有附加属性的枚举来做一些基本的事情,比如提供显示名称或描述:

public enum Movement {
    [DisplayName("Turned Right")]
    TurnedRight,
    [DisplayName("Turned Left")]
    [Description("Execute 90 degree turn to the left")]
    TurnedLeft,
    // ...
}
Run Code Online (Sandbox Code Playgroud)

并且有一组扩展方法来支持这些属性:

public static string GetDisplayName(this Movement movement) { ... }
public static Movement GetNextTurn(this Movement movement, ...)  { ... }
Run Code Online (Sandbox Code Playgroud)

遵循此模式,可以将其他现有或自定义属性应用于字段以执行其他操作.它几乎就像枚举可以作为简单的枚举值类型一样工作,也可以作为一个包含许多字段的更丰富的不可变值对象:

public class Movement
{
    public int Value { get; set; } // i.e. the type backing the enum
    public string DisplayName { get; set; }
    public string Description { get; set; }
    public Movement GetNextTurn(...) { ... } …
Run Code Online (Sandbox Code Playgroud)

.net c# extension-methods design-patterns anti-patterns

15
推荐指数
2
解决办法
1093
查看次数

C#Regular Expression来验证日期?

我正在尝试验证输入到文本框中的日期.文本框上有一个输入掩码,强制输入xx/xx/xxxx.我正在尝试使用正则表达式验证程序来强制输入正确的日期.我根本不熟悉RegEx.我的同事在互联网上找到了这个,但我无法真正说出它在做什么.

这看起来不错吗?似乎过于复杂......

(^((((0[1-9])|([1-2][0-9])|(3[0-1]))|([1-9]))\x2F(((0[1-9])|(1[0-2]))|([1-9]))\x2F(([0-9]{2})|(((19)|([2]([0]{1})))([0-9]{2}))))$)
Run Code Online (Sandbox Code Playgroud)

有没有人知道一个不太复杂的表达,基本上做我需要的东西?

c# regex validation date

14
推荐指数
3
解决办法
7万
查看次数

处理DDD中的嵌套聚合

我刚刚开始使用DDD,我在确定如何适应数据的关系性质方面遇到了一些麻烦.我有我认为会被视为我的聚合根,但聚合也有自己的聚合.我不想违反德米特法则,我想知道我是否正在考虑这个错误,并希望一些DDD专家可以提供一些见解.

我的聚合根是我的Account对象,它有许多AccountElement实体的集合,它们本身就是各个ProductComponent实体的逻辑分组.

一个AccountElement的上下文之外Account已经没有任何意义,所以我很舒服,我的结论是,Account对象是我聚合根,我预计其总实体Elements属性.这是让ProductComponent我感到困惑的系列.该集料具有外没有任何意义AccountElement,而真正具有的外部没有任何意义Account.

我认为我不应该通过点击它来访问单个ProductComponent对象,例如:

var reference = account.Elements(0).ProductComponents(0).ReferenceCode;
Run Code Online (Sandbox Code Playgroud)

但与此同时,(从域的角度来看)ProductComponent直接从Account实体访问是没有意义的.

我确信如果不了解我的域名,这有点难以理解,但我希望这足以得到一些好的反馈.

domain-driven-design aggregateroot

14
推荐指数
1
解决办法
3697
查看次数

Jquery - 如果页面已加载

有没有什么技巧如何在javascript中启动一个函数,它在页面完全加载时启动?

javascript jquery

13
推荐指数
2
解决办法
3万
查看次数

Debugger和Intellitrace在文本查看器中显示长SqlCommand.CommandText的截断文本

我试图找出select使用Entity Framework对SQL Server做出的声明的文本内容.CommandTextIntelliTrace和调试器下的属性在文本视图中将文本截断为正好4096个字符.有没有办法看到所有这些或配置这些工具至少提高限制?

更新:这仍然是VS 2015诊断工具的一部分.

debugging entity-framework visual-studio watch-window intellitrace

12
推荐指数
1
解决办法
965
查看次数

如何将xmldocument保存到流中

我已经编写了代码来解析我的xml文件,XmlReader所以我不想重写它.我现在已经为程序添加了加密功能.我有encrypt()和decrypt()函数,它们采用xml文档和加密算法.我有一个使用xml阅读器来解析文件的函数,但现在使用xml文档我不知道如何创建xmlreader.

问题是如何将我的xml文档保存到流.我确信它很简单,但我对流不了解.

XmlDocument doc = new XmlDocument();
        doc.PreserveWhitespace = true;
        doc.Load(filep);
        Decrypt(doc, key);

        Stream tempStream = null;
        doc.Save(tempStream);   //  <--- the problem is here I think

        using (XmlReader reader = XmlReader.Create(tempStream))  
        {
            while (reader.Read())
            { parsing code....... } }
Run Code Online (Sandbox Code Playgroud)

c# xmldocument xmlreader

12
推荐指数
1
解决办法
5万
查看次数

switch 表达式中的多个语句:C# 8

Switch 表达式是在 C# 8 中引入的。代码库中有很多地方可以用这种新风格重写。

例如,我有一些代码,用于从字节流中解析数据包:

switch (command)
{
    case Command.C1:
        return new P1();
    case Command.C2:
        return new P2();
    default:
        stream.Position++;
        return null;
}
Run Code Online (Sandbox Code Playgroud)

问题是 - 它不能转换为像这样的 switch 表达式

return command switch
{
    Command.C1 => new P1(),
    Command.C3 => new P2(),
    _ => { stream.Position++; return null; }
};
Run Code Online (Sandbox Code Playgroud)

我想到的第一件事是使用 a Func<>,它编译:

return command switch
{
    Command.C1 => new P1(),
    Command.C3 => new P2(),
    _ => new Func<AbstractPacket>(() => { stream.Position++; return null; })()
};
Run Code Online (Sandbox Code Playgroud)

F# 已经允许在每个分支中包含多个语句的代码:

match command …
Run Code Online (Sandbox Code Playgroud)

c# c#-8.0 switch-expression

12
推荐指数
2
解决办法
3382
查看次数