小编drh*_*ris的帖子

重构单身过度使用

今天我顿悟了,而且我做错了.一些历史:我继承了一个C#应用程序,它实际上只是一个静态方法的集合,一个完全程序化的C#代码.我重构了这个当时最了解的,带来了大量的大学后OOP知识.长话短说,代码中的许多实体都变成了单身人士.

今天我意识到我需要3个新类,每个类都遵循相同的Singleton模式来匹配软件的其余部分.如果我一直在这个滑坡上翻滚,最终我的应用程序中的每个类都将是Singleton,这与原始静态方法组完全没有逻辑上的区别.

我需要帮助重新考虑这一点.我知道依赖注入,这通常是用来打破Singleton诅咒的策略.但是,我有一些与此重构相关的具体问题,以及所有关于这样做的最佳实践.

  1. 使用静态变量封装配置信息的可接受程度如何?我有一个使用静态的大脑块,我认为这是由于大学早期的OO课,教授说静态是坏的.但是,每次访问它时,我是否应该重新配置该类?访问硬件时,是否可以保留指向所需地址和变量的静态指针,还是应该继续执行Open()Close()操作?

  2. 现在我有一个方法充当控制器.具体来说,我不断轮询几个外部仪器(通过硬件驱动程序)获取数据.这种类型的控制器应该是可行的方法,还是应该在程序启动时为每个仪器生成单独的线程?如果是后者,我该如何使这个面向对象?我应该创建名为InstrumentAListener和的类InstrumentBListener吗?或者有一些标准的方法来解决这个问题吗?

  3. 有没有更好的方法来进行全局配置?现在我只是简单Configuration.Instance.Foo地在整个代码中洒满了.几乎每个班级都使用它,所以将它保持为Singleton是有道理的.有什么想法吗?

  4. 我的很多类的事情像SerialPortWriter或者DataFileWriter,必须坐下来等待这个数据流.因为他们是活跃的整段时间,我应该怎么才能监听,当数据进入生成的事件安排这些?

关于如何摆脱单身人士和其他模式过度使用的任何其他资源,书籍或评论将是有帮助的.

.net c# oop design-patterns

45
推荐指数
1
解决办法
2369
查看次数

带有Office 64位的MS Access数据库引擎(32位)

我们目前使用Microsoft Access数据库引擎2010有一个主要问题.引擎有64位和32位形式,这很好.但是,如果主机进程始终是32位,显然您需要始终安装32位版本.好的,我们可以做到这一点.

我们的软件处理许多32位的遗留组件,其中大部分是VB6代码,它生成32位汇编.因此,我们假设驱动程序也必须安装为32位.实际上,当我们在64位计算机上安装32位驱动程序并运行我们的32位应用程序时,它可以正常工作.

但是,问题在系统上安装Office 2010 64位时开始.相信我,我们试图教育用户64位Office在很大程度上是不必要的,但无济于事.随着安装了64位版本的计算机下线,当我们的软件出现故障时,我们无法跟上支持请求.64位Office破坏了我们的安装,或者我们的安装破坏了他们的Office版本,但它不是两种方式.另一个问题是非传统软件有时会安装64位驱动程序(正如他们应该的那样),并且这两个版本根本不以任何合理的方式共存.要么我们的软件中断,要么他们的软件中断.

那么,有没有人设法找到一种方法使32位驱动程序与64位安装共存?我已经看到使用/passiveflag 安装允许安装两个,我们的安装程序确实使用被动.两者都在安装,但一旦在系统上,我们的软件不再工作,或Office不断修复其安装.有没有合理的方法来完成这项工作?

legacy installshield msde 32bit-64bit

35
推荐指数
2
解决办法
14万
查看次数

MS图表中的自动间隔精度

我目前正在使用.NET中的图表System.Windows.Forms.DataVisualization.Charting.Chart.到目前为止,它似乎非常强大,而且效果很好.然而,就如何自动计算间隔而言存在巨大的问题.我使用了很多double值,在像ZedGraph这样的库中,它完美地处理了这个问题.它选择最小/最大/间隔就好了.但是,在MS Chart中,它可以选择206.3334539832作为最小值,并选择相似小数精度的间隔.显然这看起来很难看.

因此,我尝试简单地制作轴格式,{0.00}并且在加载图表时效果很好.除非放大,否则你需要更高的精度,可能是4位小数而不是2位.看起来我要么一直处于9个小数位,要么是一个常数固定的数字,当有人需要更高的精度时它可能会破坏.我宁愿根据当前应用的缩放级别来获取精度.像ZedGraph和Dundas这样的图书馆(我相信MS甚至正在使用!)倾向于选择在放大和缩小时改变的好值.

当缩放框架改变时,有没有办法让间隔改变精度?这可能是我设置错误的一些简单属性,但很难说这个东西有数百万个属性(特别是当有大约14个地方代表Interval的概念时).

c# precision data-visualization mschart intervals

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

从.Designer.cs文件禁用/修复代码分析警告

我使用的DataVisualization.Charting.Chart很多,而且大部分都在使用.但是,我经常运行代码分析,并自己处理警告.但是,使用图表的*.Designer.cs文件中大约有30个CA2000(未沿所有异常路径布置的对象).Designer文件几乎生成了所有图表代码,几乎所有图表元素都实现了IDisposable.我在项目首选项中选中了"从生成的代码中抑制结果",但它仍然可以.

有没有办法解决这个问题,而不必手动创建图表对象,并且不会禁用该类中其余代码的代码分析?有没有办法为所有.Designer.cs文件禁用它?或者,是否有解决方案通过使设计师代码处理来正确删除这些警告?

c# code-analysis idisposable mschart ca2000

13
推荐指数
1
解决办法
3882
查看次数

事件与收益率

我有一个多线程应用程序,它为几个硬件工具生成线程.每个线程基本上都是一个无限循环(在应用程序的生命周期内),它会轮询硬件以获取新数据,并在每次收集新内容时激活一个事件(传递数据).有一个侦听器类可以合并所有这些乐器,执行一些计算,并通过此计算触发新事件.

但是,我想知道,由于只有一个侦听器,最好IEnumerable<>从这些乐器中公开一个方法,并使用a yield return来返回数据,而不是触发事件.

我想看看是否有人知道这两种方法的差异.特别是,我正在寻找最佳的可靠性,最佳的暂停/取消操作能力,最适合穿线,一般安全等.

另外,使用第二种方法是否仍然可以在IEnumerable单独的线程上运行循环?其中许多仪器都受CPU限制,因此确保每个仪器都在不同的线程上是至关重要的.

c# events multithreading yield

11
推荐指数
1
解决办法
807
查看次数

Should I be using inheritance?

This is more of a subjective question, so I'm going to preemptively mark it as community wiki.

Basically, I've found that in most of my code, there are many classes, many of which use each other, but few of which are directly related to each other. I look back at my college days, and think of the traditional class Cat : Animal type examples, where you have huge inheritance trees, but I see none of this in my code. My …

oop inheritance class-design

8
推荐指数
1
解决办法
422
查看次数

单击应用程序,并检测首次启动新版本

有没有一种简单的方法来检测新的一次性应用程序版本的首次启动?IE:我已经发布了版本1,然后我发布了1.1.在1.1版的第一次发布时,我想在它启动时执行一次性过程.

谢谢,

标记

.net c# clickonce .net-4.0 visual-studio-2010

8
推荐指数
1
解决办法
1280
查看次数

替代XML序列化配置

目前,我们使用一个与XML序列化的巨型配置对象.这在大多数情况下都运行良好,但我们发现在断电和应用程序崩溃的情况下,文件可能会处于使其无法正确反序列化的状态,从而有效地破坏配置信息.

我想使用内置的app.config,但它似乎不容易支持自定义类.例如,使用XML序列化,我可以轻松地序列化通用list<ComplexClass>而无需额外的代码.它只是有效.似乎在使用app.config时,您必须提供大量信息和自定义类才能使用.此外,大多数"自定义配置"教程大约来自2007年,可能已经过时了.有没有人有关于在.NET 4.0中执行此操作的最新方法的信息?

另外,当应用程序出现问题时,由于配置不当,这是9/10次.App.config喜欢将用户可更改的设置存储在非常难以访问的位置,供不熟悉隐藏目录等的用户使用.有没有办法让一个位置存储配置文件,用户可以在出现问题时轻松向我们发送电子邮件?

或者,这是否比我记得它在2.0天的早期更容易?有关如何轻松执行自定义app.config信息的任何链接或快速示例都会很棒.

作为另一个例子,这是我想要序列化的一种对象类型的精简版本List<Alarm>,因为Alarms 的数量可以变化或为空.有没有类似的方法在app.config中存储这样的东西?

[Serializable]
public class Alarm
{
    [Serializable]
    public class AlarmSetting
    {
        public enum AlarmVariables { Concentration, RSquared }
        public enum AlarmComparisons { LessThan, GreaterThan }

        [Description("Which entity is being alarmed on.")]
        public AlarmVariables Variable { get; set; }
        [Description("Method of comparing the entity to the setpoint.")]
        public AlarmComparisons Comparator { get; set; }
        [Description("Value at which to alarm.")]
        public Double Setpoint { get; set; }
    }

    public String …
Run Code Online (Sandbox Code Playgroud)

.net c# app-config xml-serialization

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

避免与策略模式的耦合

我试图将策略模式应用于特定情况,但是我遇到了如何避免将每个具体策略与为其提供数据的上下文对象耦合的问题.以下是以几种不同方式发生的模式的简化情况,但应以类似的方式处理.

我们有一个对象Acquisition提供与特定时间相关的数据 - 基本上是使用不同硬件收集的一堆外部数据.它已经太大了,因为它包含了大量的数据,所以我不想给它任何进一步的责任.我们现在需要采取一些这样的数据,并根据一些配置向一块硬件发送相应的电压.

所以,想象下面的(简化的)类:

class Acquisition
{
    public Int32 IntegrationTime { get; set; }
    public Double Battery { get; set; }
    public Double Signal { get; set; }
}

interface IAnalogOutputter
{
    double getVoltage(Acquisition acq);
}

class BatteryAnalogOutputter : IAnalogOutputter
{
    double getVoltage(Acquisition acq)
    {
        return acq.Battery;
    }
}
Run Code Online (Sandbox Code Playgroud)

现在,每个具体的策略类都必须耦合到我的Acquisition类,它也是最可能被修改的类之一,因为它是我们应用程序的核心.这仍然是对旧设计的改进,旧设计是课堂的一个巨大的开关声明Acquisition.每种类型的数据都可能有不同的转换方法(虽然电池是一个简单的传递,其他类型根本不是那么简单),所以我觉得战略模式或类似应该是要走的路.

我还要注意,在最终实现中,IAnalogOutputter将是一个抽象类而不是接口.这些类将位于可由用户配置并序列化为XML文件的列表中.该列表必须在运行时可编辑并记住,因此Serializable必须是我们最终解决方案的一部分.如果它有所作为.

如何确保每个实现类获取它需要工作的数据,而不将其绑定到我最重要的类之一?还是我以完全错误的方式处理这类问题?

c# oop design-patterns strategy-pattern decoupling

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

防止,避免或绕过AppCrash

我们得到一个看似随机的AppCrash,其中windows实际接管进程并关闭它,给出一些神秘的调试报告,包括NTDLL.dll,StackHash,User32.dll等.在报告中研究这些模块和信息超过一年之后我们收到的信息就更多了.我们能够做的最好的事情是将其缩小到我们的应用程序用来与通过TCP/IP进行通信的硬件进行交互的DLL.我们无法控制这个外部库,必须使用它,并且鉴于问题是随机的(不能在我们的最终复制,在PC重启时解决),我们似乎一直坚持下去.

问题是我们的应用程序需要在不受人类监控的仪器上全天候运行.我需要检测应用程序何时崩溃,并向整个事件发出重启命令.问题是检测到AppCrash; 应用程序内部不会生成异常(AppCrash在应用程序外部),并且没有任何日志记录会生成程序正在关闭的任何指示.

我们要做的是运行检查应用程序是否运行的服务,如果没有,它会发出重启命令来重启系统.但是,当显示AppCrash对话框时,它将使进程保持运行状态.

有没有办法阻止这些AppCrash通知,绕过它们,或者设置它们至少先关闭程序?请不要指向stackhash.com或使用MS错误报告; 这些设备不具备互联网功能.我们也无法修复我们正在使用的DLL中的任何错误(OEM供应商不合作).

c# crash

4
推荐指数
1
解决办法
3304
查看次数