我的前缀是说我理解Code Analysis和StyleCop都是指导原则,很多人选择忽略这些.但话说回来,我想看看这两条规则的普遍共识是什么.
规则CA1500表示不要使参数名称和私有字段名称相同.
另一方面,规则SA1309表示不要为成员添加下划线或"m_"作为前缀.
这使我们几乎没有选择区分私有支持字段与其相应的参数.拿这些例子.
SA1309抱怨:
class SomeClass
{
int _someField;
public SomeClass(int someField)
{
this._someField = someField;
}
}
Run Code Online (Sandbox Code Playgroud)
CA1500抱怨:
class SomeClass
{
int someField;
public SomeClass(int someField)
{
this.someField = someField;
}
}
Run Code Online (Sandbox Code Playgroud)
我有什么选择?我不想创建私有支持字段PascalCase,因为这是公共字段/属性的(我相信相当普遍的)约定.而且我不想重命名其中一个,只是为了解决歧义.
所以我留下了上面两个中的一个,这将要求我压制其中一个SA/CA规则.
你们通常做什么?更重要的是,这些规则的作者认为你应该做些什么(因为它们都没有在他们的文档中提供替代解决方案)?
我知道最好尽量减少每个页面需要的请求数量.例如,组合javascript文件和使用css sprites将大大减少呈现页面所需的请求数.
我见过的另一种方法是将javascript嵌入页面本身,特别是对于特定于该页面的javascript,而不是真正在其他页面上共享.
但我的问题是:
在什么时候我的javascript变得太大,以至于将脚本拉入单独的文件并允许对单独的js文件的额外请求变得更有效?
换句话说,我如何测量多少字节等于一个请求的成本?
由于连续请求被缓存,因此调用相同js文件的唯一成本是请求的成本.将js保留在页面中将始终产生额外页面大小的成本,但不会产生额外请求的成本.
当然,我知道有几个因素:客户端的速度,带宽速度,延迟.但是必须有一个转折点,一个人做另一个更有意义.
或者,带宽如此便宜(速度,而不是金钱)这些天它需要比以往更多的字节,以超过请求的成本?似乎是一种趋势,页面大小变得不那么重要,而请求的成本已经趋于稳定.
思考?
使用MVC3,我应该设计我的视图模型,以便有一个绑定到视图(DisplayModel),还有一个回发到控制器(EditModel)?
为了澄清,我不是在询问数据模型与视图模型 - 我知道将视图/控制器绑定到数据/域模型并不好.
我也不是要求跨两个单独的视图共享一个模型,一个用于显示数据的视图,另一个用于编辑数据的视图.
相反,我问的是一个用于编辑数据的视图,以及绑定到视图的模型与绑定到控制器操作的模型.
换句话说,如果这是我的观点:
@model MyApp.Models.CustomerModel
Run Code Online (Sandbox Code Playgroud)
我的控制器动作应该是这样的:
public ActionResult Index(CustomerModel model)
Run Code Online (Sandbox Code Playgroud)
要么:
public ActionResult Index(CustomerEditModel model)
Run Code Online (Sandbox Code Playgroud)
有一次,我们正在做后者(单独).但最近,我们开始做前者(共享).
这种变化的原因是因为:
使用MVC3不引人注意的验证,如果我在我的模型上使用DataAnnotations进行验证,如果它们是分开的(在显示模型上映射客户端验证,在服务器端验证的编辑模型上),则需要在两个模型中使用它们. .
随着我们的应用程序的成熟,我们意识到我们的显示和编辑模型是95%相同的,除了我们的视图模型中的选择列表.我们现在将它们移动到一个共享类,现在通过视图传递它们.
但我已经看到其他一些讨论指出,让视图/控制器共享模型是一个坏主意,并且它违反了关注点的分离.
有人可以帮我理解这两种方法的权衡吗?
我的模型有一个值,它必须在我的模型上的两个其他值的范围内.
例如:
public class RangeValidationSampleModel
{
int Value { get; set; }
int MinValue { get; set; }
int MaxValue { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
当然,我不能将这些Min/MaxValues传递给我的DataAnnotations属性,因为它们必须是常量值.
我确定我需要构建自己的验证属性,但是我没有这么做,也无法理解它应该如何工作.
我已经搜索了大约一个小时,并且已经看到了各种用于构建自定义验证的解决方案,但是使用MVC3不显眼的验证找不到任何解决这个特定问题的方法.
asp.net-mvc data-annotations unobtrusive-validation asp.net-mvc-3
Windows在路径中限制为259个字符.不幸的是,由于我们的一些服务引用名称,这开始给我们带来问题.
例如,我们的TFS分支具有已经很长的路径,然后.NET服务引用几乎加倍,因为它们总是使用完全限定的命名空间作为文件名:
Some.Really.Long.Fully.Qualified.Namespace.Service.Reference.Name.datasource
AFAIK,你不能改变服务引用的名称 - 但是我错了.可以这样做吗?
如果没有,这个烦人的问题还有其他可行的解决方法吗?
编辑:此外,我知道一个明显的解决方案是缩短我们的命名空间和/或路径,但假设在这种情况下我们不能这样做.:)我主要是想弄清楚如何控制服务引用的文件名.
更新:我遇到的根本问题是TFS不允许我获取特定分支的最新信息.这是确切的错误:
TF205022:以下路径包含超过允许的259个字符:[C:\ Some-really-long-259-character-path-here]
.net windows namespaces visual-studio-2010 service-reference
我有一个使用IoC(Unity)的MVC 3站点,我的模型是用EF4和POCO生成的.我正在使用动作过滤器来提交我的UnitOfWork:
public class UseUnitOfWorkAttribute : ActionFilterAttribute, IActionFilter
{
private readonly IUnitOfWork _unitOfWork;
public UseUnitOfWorkAttribute()
{
_unitOfWork = IoCFactory.Instance.CurrentContainer.Resolve<IUnitOfWork>();
}
void IActionFilter.OnActionExecuted(ActionExecutedContext filterContext)
{
_unitOfWork.Commit();
}
void IActionFilter.OnActionExecuting(ActionExecutingContext filterContext)
{
}
}
Run Code Online (Sandbox Code Playgroud)
然而,即使Commit()似乎被解雇了,它似乎在某种程度上缓存了它认为"肮脏"的东西.
例如,在我的控制器中,以下内容从服务类执行:
var user = _userRepository.Single(u => u.Id == 2);
user.DateAdded = DateTime.Now;
Run Code Online (Sandbox Code Playgroud)
每当我重新构建解决方案并点击此控制器操作时,实际上都会提交更改.但是,对控制器的连续命中不会做任何事情.
另一方面,如果我将UnitOfWork放在我的控制器中并在服务方法调用之后提交它,它会按预期工作(每次我请求控制器操作时):
public AccountController()
{
_unitOfWork = IoCFactory.Instance.CurrentContainer.Resolve<IUnitOfWork>();
}
public ActionResult Test()
{
var user = _userRepository.Single(u => u.Id == 2);
user.DateAdded = DateTime.Now;
_unitOfWork.Commit();
}
Run Code Online (Sandbox Code Playgroud)
所以看起来肯定会出现某种缓存,但我无法弄清楚缓存的内容 - UnitOfWork,ActionFilter或存储库.
什么想法可能会发生什么?如果没有,任何想法我还能做些什么来排除故障?
提前致谢.
asp.net-mvc caching inversion-of-control unit-of-work action-filter
简单问题:我的用户可以拥有许多可以拥有许多产品的订单.Linq(lambda)查询是什么样的,以获得用户对所有Product.Price值的总计?
我试过这个:
int total = users.Sum(u => u.Orders.Sum(o => o.Products.Sum(p => p.Price)));
Run Code Online (Sandbox Code Playgroud)
但它给了我:
转换为值类型"Int32"失败,因为实现值为null.结果类型的泛型参数或查询必须使用可空类型.
当然,用户可能没有任何订单,订单可能没有任何产品.但是Product.Price不是可以为空的值.
所以我尝试了这个,认为它在空集合上窒息:
int total = users.Sum(u => u.Orders.Sum(o => o.Products.Sum(p => p.Price) ?? 0) ?? 0) ?? 0;
Run Code Online (Sandbox Code Playgroud)
但它正在抛出编译错误,说它的左侧??不可为空.
我究竟做错了什么?
提前致谢.
更新:从他的答案中使用Marc的逻辑后,我的上述示例的工作版本:
int total = users.Sum(u => u.Orders.Sum(o => o.Products.Sum(p => (int?)p.Price))) ?? 0;
Run Code Online (Sandbox Code Playgroud) 有没有办法清除ViewBag?
ViewBag 没有二传手,所以它不能简单地被淘汰:
ViewBag = null;
Run Code Online (Sandbox Code Playgroud)
我也似乎无法使用反射来迭代它并消除其动态属性,因为您无法创建一个实例dynamic.
注意:我知道ViewBag它本身就有点代码味道,因为它不是强类型的,并且基本上是一个巨大的全局变量集合.我们正在远离它,但在此期间仍然需要处理它.
asp.net-mvc ×5
c# ×4
.net ×1
caching ×1
fxcop ×1
http ×1
lambda ×1
linq ×1
namespaces ×1
performance ×1
stylecop ×1
tdd ×1
unit-of-work ×1
unit-testing ×1
viewbag ×1
viewmodel ×1
windows ×1