小编And*_*ens的帖子

如何将整个映射设置为只在NHibernate 3.2中按代码映射?

我刚刚开始使用NHibernate 3.2及其"按代码映射"功能,并将我们的Fluent映射迁移到它.是否有一个流利的"ReadOnly();" 功能,使整个映射只读?提前致谢.

nhibernate-mapping

5
推荐指数
2
解决办法
3774
查看次数

WPF字体质量

我正在开发一个WPF应用程序,但我注意到在某些字体大小的情况下,文本的渲染效果不如您在控制面板 - >字体中看到的样本.我正在使用大型Segoe UI字体(FontSize="36"),并且在直立线上效果更明显,例如字母"U"可能在一侧比另一侧稍厚.).

字体质量在某些字体大小FontSize="48"上有所改善,例如(我认为相当于36pt),但使用有限数量的字体大小并不总是实用的.

我可以通过将以下属性应用于TextBlock来提高字体质量: -

TextOptions.TextFormattingMode="Display" TextOptions.TextRenderingMode="ClearType"
Run Code Online (Sandbox Code Playgroud)

鉴于质量的提高,我很想知道为什么WPF不会为所有文本执行此操作,还是归结为性能?我正在考虑创建一个全局样式以将其应用于所有控件,或者这会导致问题吗?

(我尝试上传截图,但SO必须以低质量存储图像,而你无法确定字体问题).

wpf fonts font-size

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

温莎城堡如何避免服务定位器模式?

我正在使用温莎城堡,并且在大多数情况下,我是通过类构造函数使用DI的。但是,有时我发现自己使用服务定位器来解析类型的实例,我知道这是一种反模式。我相信您还必须释放以这种方式解析的瞬态对象,因为温莎不会为您这样做吗?

一个示例场景是模拟电视遥控器的类。UI具有许多按钮,单击一个按钮将导致类实例化并执行特定的“命令”对象。通过构造函数注入所有这些具体命令显然是不可行的,因此我将使用服务定位器,如下所示:-

private void PowerButtonOnClick()
{
    var command = ServiceLocator.Current.Resolve<IPowerOnCommand>();
    command.Execute();
}
Run Code Online (Sandbox Code Playgroud)

我将如何重构代码以摆脱服务定位器,确保完成后释放临时类型(如果Windsor确实需要这样做)?

(我意识到上述场景可以使用“命令”设计模式来解决。这只是一个示例场景-在其他情况下,我正在使用服务定位器)。

design-patterns castle-windsor

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

带有IoC的SignalR(Castle Windsor) - 集线器的寿命是多少?

我刚刚开始使用SignalR,并为SignalR创建了一个自定义解析器,因此我可以使用Castle Windsor通过集线器构造器注入依赖项.

我有点假设我只需要注册依赖项,但我发现在我的应用程序工作之前还必须自己注册集线器.这是预期的吗?如果是这样,我应该用什么寿命用于集线器?

castle-windsor inversion-of-control signalr signalr-hub

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

MVVM 中模型的职责是什么?

我一直对“模型”应该或不应该包含什么感到有点困惑 - 教程和示例经常相互矛盾。到目前为止,我一直在谨慎行事,我的模型仅公开“UI 内容”,例如用于绑定到视图的属性以及验证逻辑。但是模型中包含其他业务逻辑是否可以接受?

假设我想通过网络服务控制机械泵,该服务提供了以给定速度打开泵以及再次关闭泵的方法。我的 UI 视图可能包括“开”和“关”按钮,以及一个用于设置速度的文本框。考虑到这一点,我的模型可能会这样开始:-

public class Pump
{
    public int Speed { get; set; }
}

// The real thing would implement INotifyPropertyChanged, validation, etc.
Run Code Online (Sandbox Code Playgroud)

这是模型应该做的全部事情吗?或者公开用于打开和关闭泵的业务逻辑是否可以接受 - 或者作为视图模型调用的方法,或者甚至作为可以直接绑定到视图的 ICommand纽扣?或者所有这些都应该在视图模型中?

编辑 不知道为什么投反对票,因为我认为这是一个完全合理的问题。虽然网络上有许多 MVVM 教程和示例,但它们经常提供关于什么去哪里的相互矛盾的建议,就像下面提供的答案一样。我什至最终阅读了 WPF 专家 Josh Smith 撰写的“高级 MVVM”电子书 - 这本书没有提到任何模型!

不管怎样,我在这里为任何想要了解 MVVM 结构的人找到了一个很好的资源。虽然该链接将带您进入 Microsoft Prism 框架的文档,但此特定页面全部是关于 MVVM 结构,很少或没有 Prism 特定内容。我发现该页面内容非常丰富,至少让我安心,确认我在过去几年中所做的事情是完全有效的 - 也就是说,拥有实现 INPC 和验证的模型 (IDataErrorInfo) ,并通过 VM 属性将这些模型直接绑定到视图(而不是像下面的一些答案所提倡的那样,在 VM 中重复模型属性)。

wpf mvvm

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

ItemTemplate 和 ItemContainerStyle 不能一起使用吗?

我正在尝试将 ItemTemplate 和 ItemContainerStyle 应用于 ItemsControl:-

<ItemsControl ItemsSource="{Binding LogEntries}"
              ItemTemplate="{StaticResource itemTemplate}"
              ItemContainerStyle="{StaticResource itemContainer}" />
Run Code Online (Sandbox Code Playgroud)

然而 ItemContainerStyle 似乎被忽略了(但如果我删除了 ItemTemplate 它确实有效)。

项目模板相当复杂,用于许多不同的视图。在一个特定视图中,我需要更改列表项的间距和背景颜色,因此我还尝试应用 ItemContainerStyle,如下所示:-

<Style x:Key="itemContainer"
       TargetType="ContentPresenter">
    <Setter Property="ContentTemplate">
        <Setter.Value>
            <DataTemplate>
                <Border x:Name="itemBorder"
                        Margin="4,0,4,4"
                        Background="#666666">
                    <ContentPresenter Content="{Binding}" />
                </Border>
            </DataTemplate>
        </Setter.Value>
    </Setter>
</Style>
Run Code Online (Sandbox Code Playgroud)

我有点惊讶你不能同时申请,除非我遗漏了什么?我认为 ItemContainerStyle 实际上只是项目内容的“包装器”,无论项目的内容是否模板化?

wpf

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

我应该为我的GUI应用程序使用async"all-way"吗?

我通过开发一个相当大的WPF应用程序,通过串行通信来控制一个复杂的硬件,这是一个很好的方法.在应用程序"堆栈"的最底部,我有一个串行通信层(利用.Net'SerialPort'类).读取和写入h/w设备是系统的基本部分,由业务逻辑层的许多不同区域使用,通常散布着复杂的科学计算和其他这样的逻辑; 这些BLL方法又从整个UI层调用.

目前,业务逻辑层中的所有内容(包括SerialPort读写)都是同步的.我使用async/await的唯一一次是在UI层,通常是在调用业务逻辑时.在这里我将打电话Task.Run(),例如: -

private async void SomeButtonClick(object sender, EventArgs e)
{
    await Task.Run(() => _someBLLService.TurnPumpOn());
}
Run Code Online (Sandbox Code Playgroud)

这是一个需要几毫秒的简单示例.一个更复杂的例子是开始一个长期运行的过程(再次使用上述技术); 此业务逻辑"服务"将运行几秒或几分钟,从硬件收集数据并在此期间执行其他"控制"功能.它会定期将数据广播回UI,以便在图表上绘图(通过pubsub事件聚合器框架).上述技术运行良好,允许UI在发生此类业务层进程时保持响应.

我最近一直在考虑从串行通信代码(例如使用.ReadAsync)开始"一路异步" ,但这会对整个系统产生影响.数十个(如果不是数百个)业务逻辑方法需要重构为异步方法,直到UI层.在这里,我可以稍微简化上面的代码:

private async void SomeButtonClick(object sender, EventArgs e)
{
    await _someBLLService.TurnPumpOn();
}
Run Code Online (Sandbox Code Playgroud)

虽然我不反对解决大型重构工作,但我想知道它的好处是什么.很多人(比如Stephen Cleary)主张"异步一路"解决方案,但主要目标似乎是在调用长时间运行的BLL进程时保持UI响应,这是我的Task.Run()技术已经做到的.

c# asynchronous async-await

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

内置代码分析器与 NuGet 包

刚刚切换到VS2019我\xe2\x80\x99m探索是否使用代码分析。在项目属性\xe2\x80\x9c代码分析\xe2\x80\x9d选项卡中,有许多内置的Microsoft规则集,当我的代码违反这些规则之一时,我可以看到编辑器出现波形曲线。我可以自定义这些规则集并将 \xe2\x80\x9csave 为 \xe2\x80\x9d 来创建我自己的规则集。

\n\n

我还看到了代码分析器 NuGet 包,例如 \xe2\x80\x9cRoslynator\xe2\x80\x9d 和 \xe2\x80\x9cStyleCop.Analyzers\xe2\x80\x9d。这些和内置的 MS 规则有什么区别?真的只是因为更全面的规则/更多的选择吗?

\n\n

如果我想坚持使用内置的 MS 规则,有什么限制吗?例如,它们是否仍会在 TFS/Azure DevOps 构建期间运行并被报告?

\n

stylecop static-code-analysis roslyn-code-analysis roslynator visual-studio-2019

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

用 Python.Net 替换 IronPython?

多年来,我们一直将 IronPython 用作一些 .Net 桌面应用程序中的脚本工具。客户一直在询问我们何时会支持 Python 3,但看起来 IronPython3 仍有很长的路要走(https://github.com/IronLanguages/ironpython3)。我刚刚找到了一个名为 Python.Net 的库,并想知道它与 IronPython 有多相似,我们是否可以转移到它?

大多数 Python.Net 示例展示了如何在 Python 代码中使用 .Net 类型,我找不到任何关于如何在 C# 中实际运行 Python 代码的好示例。页面末尾有一个标题为“嵌入 Python”的部分 ( http://pythonnet.github.io/ ),但没有详细介绍。

我很想知道如何从文件或字符串运行脚本,脚本是否可以“编译”(如 IronPython),大概“变量”可以像 IronPython 作用域一样来回传递?是否有任何限制或已知问题?Python.Net 是否允许运行引用库(例如 numpy)的脚本?(我们无法在 IronPython 上使用它,我认为这是因为它包含编译的 (.pyc) 代码,而 IP 不支持该代码)。

有没有人对两者都有经验,并且能够提供一些关于它们如何比较的见解?

ironpython python.net

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

.Net Core 中仅反射程序集加载

我有一个 .Net Framework WPF 应用程序,目前正在迁移到 .Net6。启动时,它会检查可执行文件夹中的某些程序集,查找具有自定义程序集属性的程序集。然后,那些具有此功能的应用程序将被加载到当前的应用程序域中。(请注意,其中一些程序集可能已经位于应用程序域中,因为它们是正在运行的应用程序的解决方案中的项目)。

这是 4.x 代码:

private void LoadAssemblies(string folder)
{
    AppDomain.CurrentDomain.ReflectionOnlyAssemblyResolve +=
        (s, e) => Assembly.ReflectionOnlyLoad(e.Name);

    var assemblyFiles = Directory.GetFiles(folder, "*.Client.dll");
    foreach (var assemblyFile in assemblyFiles)
    {
        var reflectionOnlyAssembly = Assembly.ReflectionOnlyLoadFrom(assemblyFile);
        if (ContainsCustomAttr(reflectionOnlyAssembly))
        {
            var assembly = Assembly.LoadFrom(assemblyFile);
            ProcessAssembly(assembly);
        }
    }
}
  
Run Code Online (Sandbox Code Playgroud)

自定义程序集属性(此代码正在查找)具有一个字符串属性,其中包含该程序集中 XAML 资源文件的路径。该ProcessAssembly()方法将此资源文件添加到应用程序的合并字典中,如下所示:

var resourceUri = string.Format(
    "pack://application:,,,/{0};component/{1}",
    assembly.GetName().Name,
    mimicAssemblyAttribute.DataTemplatePath);

var uri = new Uri(resourceUri, UriKind.RelativeOrAbsolute);
application.Resources.MergedDictionaries.Add(new ResourceDictionary { Source = uri });
Run Code Online (Sandbox Code Playgroud)

重申一下,所有这些都在 .Net 4.x 应用程序中正常工作。

另一方面,.Net6不支持仅反射加载,也不能创建第二个应用程序域来加载程序集。我重写了上面的代码,将正在检查的程序集加载到我所理解的临时的、可卸载的上下文中:

    private void …
Run Code Online (Sandbox Code Playgroud)

c# reflection .net-assembly .net-core

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