小编Chr*_*ris的帖子

TDD:静态方法,依赖注入,缓存,你!

希望我可以解释一下这一点,因为它今天在我脑中燃烧了一个导火索.我正在用C#学习TDD,所以我仍然试图重新连接我的大脑以适应它.

假设我有一个User类,以前有一个静态方法来检索User对象(下面简化).

public static User GetUser(string username)
{
   User user = GetUserFromCache(username);
   if(user == null)
   {
       user = GetUserFromDatabase(username);
       StoreObjectInCache(user);
   }
   return user;
}
Run Code Online (Sandbox Code Playgroud)

所以我试图重写这个以使用依赖注入,所以我可以假设"GetUserFromDatabase"方法,如果它需要去那里.这意味着我必须使该功能不是静态的.数据访问层将从数据库构造用户对象,将返回的列映射到对象属性,从缓存中检索将返回真蓝色的User对象.但是,在非静态方法中,我不能只说

this = GetUserFromCache(username);
Run Code Online (Sandbox Code Playgroud)

因为它不会那样工作.虽然我不是世界上如何与OO一起跳舞的专家,看起来我几乎必须从缓存中获取User对象并编写另一个映射函数,将返回的User对象属性存储到新的用户实例.

这里有什么解决方案?我失踪了任何OO魔法?是重构所有内容以使用工厂而不是在对象本身中使用实例化逻辑的唯一解决方案吗?或者我一直盯着这个太久而且遗漏了一些完全明显的东西?

c# oop tdd

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

使用.NET的脱机同步选项

我被要求研究处理我们应该构建的应用程序的方法.此应用程序,假设是一个用C#编写的Windows表单,如果已连接,它将直接向服务器发出命令,但如果应用程序处于脱机状态,则必须保持状态,就像它已连接一样,然后同步并发出数据更改/命令到一旦服务器连接.

我不知道从哪里开始寻找.这类似于Google Gears,但如果我们使用Winform路线(看起来很可能,因为应用程序需要Web应用程序无法执行的其他功能),我认为我没有这个选项.Microsoft Sync框架是否可行?Silverlight会做这样的事吗?还有其他选择吗?我已经谷歌搜索了一下,但希望社区输入最佳情况.

c# synchronization offline

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

找出合适的工作语言:从C#分支出来

我在微软的环境中工作,所以我可以在我遇到的任何指甲上使用我的C#锤子.话虽这么说,什么语言(编译,解释,脚本,功能,任何类型!)补充知道C#,以及用于什么目的?例如,我已将许多脚本功能从已编译的控制台应用程序转移到Powershell脚本中.如果你是一名MS开发人员,你是否在世界上找到了其他语言的利基,如F#,IronRuby,IronPython或类似的东西,它们填补了什么样的利基?

注意:这个问题是针对微软开发人员的,因为我无法逃脱并开始在我的公司周围安装LAMP堆栈,因此必须永远支持它.:)但是,除了您的主要语言之外,您可以随意提及您认为有兴趣在您的世界中完成某项任务/角色的任何其他语言.

asp.net programming-languages

4
推荐指数
2
解决办法
389
查看次数

可以打开的窗户数量有限制吗?

我有一台非常强大的开发机器和三台显示器,所以经过一些密集的编码/问题修复后,我倾向于启动并运行大量程序。其中一些程序是标签式的;诸如 Visual Studio、FireFox、Notepad++ 之类的东西。如果我不努力关闭未使用的选项卡,似乎过了一段时间 Windows 只是拒绝打开更多,错误,窗口。我可以通过关闭一个现有的来打开另一个,但除非我这样做,否则它只是拒绝打开任何一个。

有人见过这个吗?我认为对于可以同时处理多少个 Windows,这是一个硬性限制。

windows

3
推荐指数
1
解决办法
356
查看次数

Windows工作流:从工作流中启动单独的工作流

这似乎比我猜想的要复杂得多.我有一个工作流程需要启动代码中的另一个工作流程.这是怎么做到的?我是否必须首先获得对当前工作流实例的WorkflowRuntime的引用?

workflow workflow-foundation

3
推荐指数
1
解决办法
1169
查看次数

.NET 4.0中的多线程和性能

我一直在使用.NET 4.0中的并行库.最近,我为一些大型系统必须使用的一些不寻常的读/写操作开发了一个自定义ORM.这允许我用属性装饰一个对象,并反射出来确定它必须从数据库中提取哪些列,以及它在写入时输出的XML.

由于我设想这个包装器可以在许多项目中重用,我想尽可能多地挤出它.该库主要用于.NET Web应用程序.我正在使用一次性控制台应用程序来测试框架,以便查看我创建的类.

我现在已经了解了多线程所带来的开销.多线程使它运行得更慢.从阅读四周,好像这是直观的人谁已经做了很长一段时间,但它实际上是反直觉对我说:怎么能运行的方法30次在同一时间比运行它30次连续慢?

我认为我不会因为多个线程必须争夺相同的共享对象而导致问题(虽然我还不够好,但尚未确定),所以我认为减速来自于开销产生所有这些线程和运行时保持它们都是正确的.所以:

  • 虽然我这样做主要是作为一种学习练习,但这种悲观情绪呢?对于琐碎的非IO任务,多线程是否过度杀伤?我的主要目标是速度,而不是UI或任何东西的响应.
  • 在IIS中运行相同的多线程代码会导致它加速,因为线程池中已经创建了线程,而现在我正在使用一个控制台应用程序,我认为它是单线程的,直到我告诉它否则?我即将进行一些测试,但我认为有一些基础知识我不知道为什么它会是这样或那样的.我的控制台应用程序也在我的桌面上运行,有两个内核,而一个用于Web应用程序的服务器会有更多,所以我可能也必须使用它作为变量.

optimization multithreading asp.net-4.0

3
推荐指数
1
解决办法
2623
查看次数

在课堂上正确组织公共/受保护/私人功能

Resharper(与StyleCop配对)在遵守大部分规则方面让我有点整洁.其中一个规则集(我相信来自StyleCop)强制首先放置公共函数,然后保护静态,然后保护,然后是私有静态,最后是私有.

私有函数通常是将公共函数的功能备份为帮助程序的函数.假设我有以下函数的StyleCop强制执行:

public FunctionA
public FunctionB

private FunctionAHelper1
private FunctionAHelper2
private FunctionBHelper1
private FunctionBHelper2
Run Code Online (Sandbox Code Playgroud)

...虽然这并不是那么糟糕,我发现自己希望保持支持私有方法接近调用它们的函数,所以看起来更像是这样:

public FunctionA
private FunctionAHelper1
private FunctionAHelper2

public FunctionB
private FunctionBHelper1
private FunctionBHelper2
Run Code Online (Sandbox Code Playgroud)

您学到了什么能够指导课堂中方法的组织?什么是StyleCop想要公共/受保护/私人订购的理由?它真的归结为偏好问题,还是我没有看到的好处?

oop

3
推荐指数
1
解决办法
923
查看次数

Windows Workflow:为什么它们会陷入持久性?

我有一个使用SQL持久性的Windows Workflow实例,由于工作流是由ASP.NET表单提交启动的,所以它在Web运行时中托管.它大部分时间都运行良好,但我注意到我必须要做的事情:

我注意到nextTimer已经过时了,即使是几个小时.有时,持久性数据库中的ownerID和ownedUntil字段为空,有时则不为."未锁定"和"已阻止"字段始终为"1".

...然后工作流运行时不会重新选择它,直到我将"所有者"字段归零,如果它们已经填充并用循环启动应用程序池,那么大部分事情都会很好.没有错误(我已经尝试/捕获所有内容的块并写出捕获到跟踪文件中的任何内容),所以不是这样.

导致持久性的延迟活动都设置为一分钟,运行时的所有权持续时间也为60秒.它被困在的代码应该总是不到一分钟.

在我写这篇文章的时候,我很好奇是应用程序池/应用程序域的回收导致它......当工作流尝试调用运行时中的任何方法时,它正忙着启动应用程序域/池并可能泄漏所有权持续时间为60秒 听起来有点合理,会导致它不能正常补水吗?

除了那个侧面,我能看到什么可能导致这种行为?我不想每天通过解开卡住的工作流来照看运行时.

workflow-foundation

2
推荐指数
1
解决办法
1711
查看次数

C#中的条件编译hackery - 有没有办法解决这个问题?

我有一个内部API,我希望其他人在他们的项目中作为编译的DLL引用.当它是一个被引用的独立项目时,我使用条件编译(#if语句)来根据编译符号切换关键Web服务类的行为.问题是,一旦生成了一个程序集,它就会被锁定到最初编译时编译符号的内容 - 例如,如果这个程序集是用DEBUG编译的并且被另一个项目引用,即使另一个项目是作为RELEASE构建,程序集仍然像在DEBUG中一样,因为它不需要重新编译.这是有道理的,只是给出一些背景知识.

现在我正在尝试解决这个问题,以便通过其他方式切换程序集的行为,例如扫描交换机的app/web配置文件.问题是,我正在切换的程序集的一些代码是方法的属性,例如:

#if PRODUCTION
        [SoapDocumentMethodAttribute("https://prodServer/Service_Test", RequestNamespace = "https://prodServer", ResponseNamespace = "https://prodServer")]
#else
        [SoapDocumentMethodAttribute("https://devServer/Service_Test", RequestNamespace = "https://devServer", ResponseNamespace = "https://devServer")]
#endif
        public string Service_Test()
        {
            // test service
        }
Run Code Online (Sandbox Code Playgroud)

虽然可能有一些语法糖允许我以另一种方式在同一类型的两个属性之间翻转,但我不知道.有任何想法吗?

另一种方法是引用整个项目而不是程序集,但如果可以的话,我宁愿坚持引用已编译的DLL.如果需要的话,我也完全乐于采用一种全新的方法来解决问题.

c# conditional-compilation

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