在使用TDD时我使用Assert.Fail很多.我通常一次只进行一次测试但是当我得到想要实现的东西的想法时,我会快速写一个空的测试,其中测试方法的名称表明我想要实现的todo-list.为了确保我不忘记我在主体中放置了一个Assert.Fail().
在尝试xUnit.Net时,我发现他们没有实现Assert.Fail.当然你总是可以Assert.IsTrue(false),但这并没有表达我的意图.我得到的印象是Assert.Fail没有故意实施.这被认为是不好的做法吗?如果是这样的话?
@Martin Meredith这不完全是我做的事.我先写一个测试,然后实现代码使它工作.通常我会同时考虑几个测试.或者我想在我正在做其他事情的时候写一个测试.那是我写一个空洞的失败测试来记住的时候.当我开始编写测试时,我整齐地尝试测试.
@Jimmeh这看起来是个好主意.忽略的测试不会失败,但它们仍会显示在单独的列表中.必须尝试一下.
@Matt Howells好主意.在这种情况下,NotImplementedException比assert.Fail()更好地传达意图
@Mitch Wheat这就是我想要的.它似乎被排除在外以防止它以另一种滥用它的方式被滥用.
我正在使用温莎城堡作为我正在研究的宠物项目.我开始注意到我需要在代码中的不同位置调用IoC容器来创建新对象.这种对容器的依赖使我的代码难以维护.
我用过两种解决方案来解决这个问题
我试图创建抽象工厂作为容器周围的包装器,我可以注入我需要创建对象的应用程序的部分.这有效,但有一些缺点,因为城堡很难将自己的容器注入依赖.所以我必须手工完成,这种方式会破坏IoC容器的整个目的.
我已经使用主应用程序控制器类来包装IoC容器并作为中央工厂/存储库工作.这是非常成功的,但是这个类太大了,就像一个中心神对象,几乎所有其他对象都有它的引用.
两种解决方案都有一些工作,但两者都有其缺点.所以我很好奇其他人是否有同样的问题,并找到了更好的解决方案.
编辑 问题不适用于依赖于对象B的对象A.这里我通常只使用构造函数注入,一切正常.有时我有类型A的对象需要在其生命周期中创建可变数量的其他类型的B对象.我不知道该怎么做.
@Blair Conrad:直到现在,维护问题并不严重.我有一些类依赖于容器对象调用container.Resolve <>.而且我不希望我的代码取决于我认为的基础设施.我还在尝试,所以我注意到在从这个项目的ninject切换到城堡时我必须更改很多代码.
@flowers:嗯.我喜欢你的拳头解决方案.它结合了我尝试过的两种解决方案.我认为我仍然在对象中思考太多而在界面/职责方面还不够.我尝试过专门建造的工厂,但我想让他们在幕后使用容器来创建对象,而我却不知道如何以一种干净的方式将容器转移到对象中.
oop dependency-injection castle-windsor inversion-of-control
快速浏览一下今天的互联网似乎表明Adobe Flash是在网页中嵌入视频的明显选择.这是准确的,还是其他有效的选择?ASP.NET作为平台的选择是否会影响这一决定?
我在使用.net技术的应用程序开发方面有近6年的经验.多年来我作为一个更好的OO程序员得到了改进,但是当我看到其他人编写的代码(尤其是Jeffrey Richter,Peter Golde,Ayende Rahien,Jeremy Miller等人)时,我觉得我和他们之间有代沟.设计.我通常在ReSharper等工具的帮助下动态设计我的类,用于重构和代码组织.
所以,我的问题是"成为更好的OO程序员需要什么".是吗
a)经验
b)书籍(请参考)
c)过程(tdd或uml)
d)模式
e)其他什么?
如何验证设计是否良好,易于理解和可维护.因为在行业中有如此多的流行语,如依赖注入,IoC,MVC,MVP等,应该更多地集中在设计中.我觉得抽象是关键.还有什么?
我正在编写一个应用程序来启动和监视C#中的其他应用程序.我正在使用System.Diagnostics.Process类来启动应用程序,然后使用Process.Responding属性监视应用程序,以每100毫秒轮询一次应用程序的状态.我使用Process.CloseMainWindow来停止应用程序或Process.Kill如果它没有响应就杀死它.
我注意到一种奇怪的行为,有时进程对象进入一种状态,即当底层进程在循环中挂起并且它不响应CloseMainWindow时,响应属性总是返回true.
重现它的一种方法是在启动流程实例后立即轮询Responding属性.所以举个例子
_process.Start();
bool responding = _process.Responding;
Run Code Online (Sandbox Code Playgroud)
将重现错误状态
_process.Start();
Thread.Sleep(1000);
bool responding = _process.Responding;
Run Code Online (Sandbox Code Playgroud)
将工作.将睡眠周期减少到500将再次引入错误状态.
启动后调用_process.Responding太快的东西似乎阻止了对象获取正确的Windows消息队列处理程序.我想我需要等待_process.Start完成它的异步工作.有没有比调用Thread.Sleep更好的方法来等待这个?我不太自信1000毫秒总是足够的.
使用DllImport导入函数时,可以指定要使用的CharSet.我注意到在C#,C++和visual basic中,.Net运行时默认使用Ansi而不是Unicode.因此,对于具有A和W版本的任何系统调用,默认情况下将调用A版本..Net在内部使用unicode,如果我没有弄错,新版本的windows也会将所有内容转换为unicode,因此这意味着需要额外的编组开销.
我已经养成了总是在这里指定unicode的习惯这是正确的做事方式还是会导致问题?
我一直在玩ASP.Net MVC一段时间了.我发现最难解决的是路由表.
我发现大多数示例都保留了默认路由.我发现这会导致很多错误,其中默认路由重定向到HomeController,并且操作不存在.导致奇怪的错误消息,您可能会看到一个简单的404.
我最终选择了一个路由设置,在那里我明确定义了我想要允许的所有控制器/动作组合,最后一个catch-all重定向到显示合理错误消息的404页面.
我在这里错过了什么吗?或者这确实是做事的好方法吗?
看看我得到的答案,我想我最好澄清一下这个问题.
我试图愚弄我正在建设的网站的路由方案.我注意到,当我离开默认的{controller}/{action}/{id}路由时,我希望显示404错误的所有类型的URL实际上都会被路由到HomeController并且操作无效并导致一些丑陋的错误而是消息.
我有点困惑,因为大多数代码示例都留在默认路由中.它有原因还是可以删除它?
我现在使用的方案看起来有点像这样
routes.MapRoute( "About", "About", new {controller = "Page", action = "About"} );
routes.MapRoute( "SignIn", "SignIn", new {controller = "Page", action = "SignIn"} );
routes.MapRoute( "SignOut", "SignOut", new {controller = "Page", action = "SignOut"} );
routes.MapRoute( "Authenticate", "Authenticate", new { controller = "Authentication", action = "Authenticate" });
routes.MapRoute("CatchAll", "{*url}", new { controller = "Error", action = "Http404" });
Run Code Online (Sandbox Code Playgroud)
我已经为系统中的每个操作指定了一条路线.并且最后要显示404.这是一个很好的方法,还是有一种更简单的方法使路由方案万无一失?
.net ×3
oop ×2
asp.net ×1
asp.net-mvc ×1
asynchronous ×1
c# ×1
embed ×1
flash ×1
pinvoke ×1
routing ×1
unicode ×1
unit-testing ×1
video ×1
xunit.net ×1