我正在使用Visual Studio的Publish按钮来部署我的网站,并希望服务器上有一个不同的App_Data文件夹.有一个复选框Leave extra files on destination (do not delete)可以防止我的App_Data文件夹被删除,但随后它会在网站更改时积累大量的遗留文件.
有没有办法让它在删除所有东西时只排除App_Data?
所以我刚刚从亚马逊的推荐信到对象LINQ使用C#4.0:使用和扩展LINQ到对象和并行LINQ(PLINQ) .
它说这本书介绍了使用dynamicLinq 的关键字,让我思考:
dynamic对于你无法用Linq 做的关键字,你能做什么样的超赞呢?
到目前为止,已经有几个问题,他们都得到了相同的答案:一个用于语言中性数据的表,1-*到一个带有翻译的表和一个索引语言ID字段.
这有几个问题:
许多数据库人员已经研究过各种理论和实践问题,但令人惊讶的是很少有人在这方面工作.
我认为我们最终需要的是:
矫枉过正?当然,也许,但整个问题都是真正的噩梦.这并不是一个不常见的场景.
我们必须设法说服服务器供应商来解决这个问题.
编辑:顺便说一句,这是我第一次使用社区维基; 希望我做对了.
编辑2:关于我的措辞的一些东西似乎让人们认为我正在攻击DBMS的概念.我不是; 我只是说内置的本地化支持是一项非常需要的功能.
我可能不应该提到表现; 在大多数情况下,它当然完全可以忽略不计.我关注的焦点在于这确实扼杀了生产力.
我举一个例子.假设我有一个非常简单的表,一个非常简单的商店:
Products (id, price, description, name, slug)
Run Code Online (Sandbox Code Playgroud)
在EF/MVC中,我将它放在ORM设计器中,可能将其封装在存储库中,构建一个Products控制器,并为索引,细节,创建,更新,编辑和删除操作.要识别任何项目中的产品,我只需要做一个WHERE(slug = @slug).我为创建/编辑操作创建了一个视图模型,设计了表单控件,并将其直接连接到存储库.做完了.要访问产品的详细信息,用户可以访问/products/details/product-slug.
但是,由于网站的其余部分是双语的,我决定相应地更改产品表.
Products (id, price)
ProductsText (productId, language, description, name, slug)
Run Code Online (Sandbox Code Playgroud)
嘿,那不是那么糟糕.是的,还没有.然后你编写你的关系和你的约束,然后你写你在视图模型中写出你的所有属性,然后你为ProductsText数据创建一个完整的CRUD控制器或使用jQuery/Ajax添加创建/更新/编辑按钮在您的Products控制器上,然后添加验证逻辑以确保用户至少输入主要语言,然后当您想要读取最终用户页面的数据时,您编写另一个查询以连接ProductsText.slug和ProductsText.语言与产品...我可能错过了一些东西,但你明白了.
一旦涉及到本地化,程序的复杂性就会随着样板代码而爆炸.
当然,我不认为问题可以完全解决,而且显然也是一个UI问题,因为它是一个数据库问题.但是,为了使这一切变得更容易,我们可以做很多事情."多字符串"字段类型可能是一个非常好的开始.
编辑3:有没有人听说过SQL Server建模服务?它有一些本地化工具,可以朝着正确的方向迈出一步.仍然是CTP.
-- Simulate the French locale with the SET LANGUAGE statement.
SET LANGUAGE French
select Id, CountryName,
[System.Globalization].[SessionsString](CountryName, 1) as …Run Code Online (Sandbox Code Playgroud) 元组中的项目没有名称,这意味着您通常没有明确的方法来记录每个项目的含义.
例如,在这种受歧视的联盟中:
type NetworkEvent =
| Message of string * string * string
| ...
Run Code Online (Sandbox Code Playgroud)
我想说明第一项和第二项分别是发件人和收件人名称.做这样的事情是一种好习惯:
type SenderName = string
type RecipientName = string
type NetworkEvent =
| Message of SenderName * RecipientName * string
| ...
Run Code Online (Sandbox Code Playgroud)
许多C/C++库都有大量的类型(例如win32.h),但在这些语言中,即使参数名在许多情况下是可选的,它仍然可以完成.F#的情况并非如此.
我刚刚开始一个新项目,现在ASP.NET MVC以极其可组合的方式设计,我认为这可能是开始单元测试的好时机.我的大多数代码都是新鲜的,我在编写实际的生产代码之前编写了测试.
不过,我的挫败感是,我花了很多时间来修复测试中的错误,而不是修复我的生产测试中的任何错误.
我的典型工作流程最终会是这样的:
如果你考虑一下,这有点令人期待:单元测试涉及手动产生输出,因此容易出错; 用严格的语言和良好的编码实践编写的代码具有非常自动指定的行为.
当然,有些奇怪的时候,我的生产代码是测试失败的真正原因,但它确实相当罕见.
当然,没有理由完全取消单元测试; 有时我完全不相信自己的代码.另一方面,我开始觉得它并不是那么有价值 - 特别是测试第一哲学.
其他人都有这种感觉吗?
我刚买了亚马逊的单元测试艺术.我非常认真地了解TDD,所以请放心,这是一个真正的问题.
但我觉得我总是在寻找放弃它的理由.
我将在这里扮演魔鬼的拥护者并试图击败TDD的所谓好处,希望有人可以证明我错了,并帮助我对其美德更有信心.我想我错过了什么,但我无法弄清楚是什么.
1. TDD减少错误
这篇经常被引用的博客文章说,单元测试是设计工具而不是用于捕获错误:
根据我的经验,单元测试不是查找错误或检测回归的有效方法.
...
TDD是一种以交互方式设计软件组件("单元")的强大方式,以便通过单元测试指定其行为.就这样!
说得通.边缘情况仍然总是在那里,而你只会找到表面上的错误 - 无论如何,只要你运行你的应用程序就会找到它们.在构建了大量软件之后,您仍需要进行适当的集成测试.
公平地说,减少错误并不是TDD应该提供的唯一帮助.
2. TDD作为设计范例
这可能是最重要的一个.TDD是一种设计范例,可以帮助您(或强迫您)使您的代码更具可组合性.
但可组合性是多重可实现的质量; 例如,函数式编程风格使代码也可以组合.当然,完全以功能样式编写大型应用程序很困难,但是为了保持可组合性,您可以遵循某些折衷模式.
如果您从高度模块化的功能设计开始,然后根据需要仔细添加状态和IO到您的代码,您将最终得到TDD鼓励的相同模式.
例如,为了在数据库上执行业务逻辑,IO代码可以在一个函数中被隔离,该函数执行访问数据库的"monadic"任务并将其作为参数传递给负责业务逻辑的函数.这将是实现它的功能性方法.
当然,这有点笨重,所以相反,我们可以将数据库IO代码的一个子集放入一个类中,并将其提供给包含相关业务逻辑的对象.这是完全相同的事情,是功能性做事方式的改编,它被称为存储库模式.
我知道这可能会给我带来非常糟糕的鞭挞,但有时候,我不禁觉得TDD只是弥补了OOP可以鼓励的一些坏习惯 - 可以通过一点点避免功能风格的灵感.
3. TDD作为文件
TDD据说可以作为文档,但它只作为同行的文档; 消费者仍然需要文本文档.
当然,TDD方法可以作为示例代码的基础,但是测试通常包含一定程度的模拟,这些模拟不应该在示例代码中,并且通常是非常人为的,以便可以评估它们与预期结果的相等性.
一个好的单元测试将在其方法签名中描述正在验证的确切行为,并且测试将不再验证该行为.
所以,我会说,你的时间可能会更好地用于抛光你的文档.哎呀,为什么不先彻底完成文档,并称之为文档驱动设计?
4.用于回归测试的TDD
在上面的帖子中提到TDD对于检测回归并不太有用.当然,这是因为当您更改某些代码时,非显而易见的边缘情况总是会陷入困境.
关于该主题还可能需要注意的是,大部分代码在相当长的时间内保持相同的可能性很大.因此,无论何时更改代码,保留旧代码并将其结果与新函数进行比较,根据需要编写单元测试是不是更有意义?
如果我已经熟悉F#事件,并且我不打算有太多的C#interop,是否有充分的理由考虑使用Reactive Framework?
我是用F#编写玩具语言的一部分.我想针对LLVM,但看起来我必须做一些工作来实现这一点.
它看起来像我也许可以做一些互操作与IRBuilder库,否则我也许能推出自己的红外发射器.据我搜索,我找不到任何其他人的解决方案.
我怎么能这样做?
我可以找到关于生成RSS提要的所有信息给出了返回不确定数量的项目的示例.
这似乎不太实际,特别是如果我有大量的条目和大量客户闲置轮询订阅源.
我应该返回多少项目是否有一个神奇的数字?我应该归还我拥有的一切吗?
我写了这个F#函数来将列表分区到某一点而不是更进一步 - 很像是takeWhile和之间的交叉partition.
let partitionWhile c l =
let rec aux accl accr =
match accr with
| [] -> (accl, [])
| h::t ->
if c h then
aux (h::accl) t
else
(accl, accr)
aux [] l
Run Code Online (Sandbox Code Playgroud)
唯一的问题是"采取"的项目是相反的:
> partitionWhile ((>=) 5) [1..10];;
val it : int list * int list = ([5; 4; 3; 2; 1], [6; 7; 8; 9; 10])
Run Code Online (Sandbox Code Playgroud)
除了诉诸调用之外rev,是否有一种方法可以编写这个函数,使第一个列表的顺序正确?
f# ×4
tdd ×2
unit-testing ×2
.net ×1
.net-4.0 ×1
algorithm ×1
asp.net ×1
c# ×1
database ×1
deployment ×1
dynamic ×1
iis ×1
linq ×1
list ×1
llvm ×1
localization ×1
msdeploy ×1
naming ×1
rss ×1
sql ×1
sql-server ×1
testing ×1
tuples ×1
type-alias ×1