小编Bob*_*y B的帖子

放弃DDD,但需要一些好处

我放弃了传统的DDD,这通常是一个巨大的时间,并迫使我做无尽的映射:data layer <--> domain layer <--> presentation layer.

即使是一个小小的改变,我必须改变数据模型,领域模型,表示模型/视图模型,然后是存储库,经理/服务类,当然还有AutoMapper映射,然后测试整个事情!每次调用都需要调用一个层,该层调用一个调用底层代码的层.除了"你将来可能需要它"之外,我得不到任何回报.咩.

我目前的做法更务实:

  • 我不再担心"数据层"和"域层"之间的区别,因为没有意义 - 这些术语是可以互换的.我让EF做它的事情,并在需要时在顶部添加接口和存储库.
  • 我已经合并了我的"数据"和"域"项目(变成"核心",无聊的名字,我知道),我几乎可以发誓Visual Studio实际上运行得更快.
  • 我允许EF实体在堆栈中上下移动,但是,我仍像往常一样将它们映射到表示模型/视图模型.
  • 对于简单的操作,我直接从控制器调用存储库,对于复杂的操作,我像往常一样使用域管理器/服务; 存储库永远不会暴露IQueryable.
  • 我将实体/ POCO定义为部分类,因此我可以在相应的部分类中单独添加域行为.

问题:我现在使用遍布各处的实体,因此客户端代码可以看到它们的导航属性.并且模型在离开存储库后始终具体化,因此这些导航属性通常为空.

可能的解决方案:
1.与之共存.它很丑,但比上面解释的问题更好.
2.对于每个实体,定义一个隐藏导航属性的接口; 并使客户端代码使用接口.但具有讽刺意味的是,这意味着另一层(尽管很薄且易于管理).
还有什么?

我不习惯这种快速和松散的编程风格,所以也许我错过了一些明显的技巧.还有什么我应该考虑的吗?我相信我很快就会遇到其他问题.

编辑: 这个问题与DDD无关.并且注意到很多人都在使用传统的DDD方法--Saymann似乎得出了相同的结论,Rahien谈到了"抽象反模式的无用抽象",而Evans自己说DDD只在5%的情况下真正有用.案例.另见这个帖子.一些评论/答案可以预见我将如何做DDD错误,或者我如何调整我的系统来做正确的事.但是,我并不是要问DDD还是在适合的情况下抨击它,而是我想知道其他人在做什么符合我上面所描述的思路.这并不是说DDD是所有设计弊病的灵丹妙药,每十年都有一个新的流程出现(RUP任何人?XP,Agile,Booch,等等......).DDD是最新的,也是最知名和最常用的.但实用主义应该是第一位的,因为我正在努力建造能够按时发货且易于维护的可销售产品.到目前为止,我学到的最有用的编程公理是YAGNI.我想要的是将我的系统改为某种"DDD-lite",在这里我得到了强大的设计/ OOP /模式哲学,但没有脂肪.

asp.net-mvc domain-driven-design entity-framework poco

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

ASP包中的绝对URL

我为谷歌地图使用了一个jQuery库,它取决于首先加载的谷歌脚本.我希望能够在包中包含这两个:

  bundles.Add(new ScriptBundle("myfoobundle").Include(
    "http://maps.googleapis.com/maps/api/js?sensor=false&amp;libraries=places",
    "~/scripts/jquery.fooplugin-{version}.js"
  ));
Run Code Online (Sandbox Code Playgroud)

这似乎不起作用(抛出一个抱怨第一个字符串的异常).有人可能会说这不起作用,因为绝对URL并不意味着缩小/捆绑.

但是当前的方法很麻烦,因为我需要确保依赖关系是正确的,并且发生在不同的地方(捆绑代码中的问题的一半,视图中的另一半).

如上所述,拥有一步解决方案会很高兴.我在这方面有什么选择吗?

更新:

解决有关使用CDN作为解决方案的意见:如果我指定bundles.UseCdn = true它没有效果,我仍然得到例外The URL 'http://maps.googleapis.com/maps/api/js?sensor=false&amp;libraries=places' is not valid. Only application relative URLs (~/url) are allowed.另外我不确定这样做的含义是什么,因为我已经使用了对jQuery等的CDN支持,所以不确定这会如何与我的用例冲突.

asp.net-mvc asp.net-mvc-4 bundling-and-minification asp.net-optimization

19
推荐指数
4
解决办法
3万
查看次数

如果不使用标准输出目录,则无法运行MVC4项目

我的项目结构如下所示:

  • src
    - 类库1
    - 类库2
    - web项目
  • bin
    - debug
    - release

MVC4 Web项目的默认输出目录是.\Bin\(即在Web项目的目录中),但我将其更改为类似..\bin\debug\..\bin\release\适合我的上述项目结构.编译好,二进制文件到正确的位置.

但是,当我运行该项目时,它抱怨说Could not load type Myproject.MvcApplication,如果我不进行上述更改,那么它可以工作.

如何控制二进制文件的位置?我希望输出目录与源目录完全分离 - 它更容易部署和更安全,因为我没有在一个地方混合使用源代码和二进制文件.

asp.net-mvc asp.net-mvc-4

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

如何动态设置Fullcalendar选项

如何在创建日历后设置minTimemaxTime选项?

我尝试了以下,但不起作用:

$('#calendar').fullCalendar('option', 'minTime', 7);
$('#calendar').fullCalendar('render');
Run Code Online (Sandbox Code Playgroud)

jquery-plugins fullcalendar

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

MVC4捆绑/缩小与IE条件注释

我正在尝试使用MVC4的新"捆绑和缩小".

对于IE条件注释,我仍然采用旧方法:<!--[if lt IE 9]><link href=.../><![endif]-->或者<!--[if lt IE 9]>@Styles.Render("~/foo")<![endif]-->我似乎没有得到自动调试/释放处理.

有没有内置的方法来做到这一点?其他人如何做到这一点?

编辑:
能够<noscript>在渲染输出中包含标签(用于回退)也很棒.

asp.net-mvc conditional-comments asp.net-mvc-4 bundling-and-minification asp.net-optimization

13
推荐指数
2
解决办法
6729
查看次数

如何在EF Where()子句中使用Predicate <T>?

我正在尝试在我的EF过滤代码中使用谓词.

这有效:

IQueryable<Customer> filtered = customers.Where(x => x.HasMoney && x.WantsProduct);
Run Code Online (Sandbox Code Playgroud)

但是这个:

Predicate<T> hasMoney = x => x.HasMoney;
Predicate<T> wantsProduct = x => x.WantsProduct;
IQueryable<Customer> filtered = customers.Where(x => hasMoney(x) && wantsProduct(x));
Run Code Online (Sandbox Code Playgroud)

在运行时失败:

The LINQ expression node type 'Invoke' is not supported in LINQ to Entities.
Run Code Online (Sandbox Code Playgroud)

我不能使用第一个选项,因为这是一个简单的例子,实际上,我正在尝试将一堆谓词组合在一起(使用和不使用等)以实现我想要的功能.

如何让EF Linq提供程序"理解"我的谓词?

如果我使用a,我会得到相同的结果Func<T, bool>.它适用于Expression<Func<T>>,但我不能将表达式组合在一起进行复杂的过滤.如果可能的话,我宁愿避免使用外部库.

更新:
如果无法做到这一点,我有什么选择?也许以某种方式组合/或/和表达表达式以达到同样的效果?

c# linq entity-framework linq-expressions

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

如何在c#中避免不可能的布尔状态?

考虑一下这个函数,您可以将其视为真值表:

public Foo doSomething(bool a, bool b) {

       if ( a &&  b) return doAB();
  else if ( a && !b) return doA();
  else if (!a &&  b) return doB();
  else if (!a && !b) return doNotANotB();

  else throw new Exception("Well done, you defeated boolean logic!");
}
Run Code Online (Sandbox Code Playgroud)

编译器坚持最后一个else子句.但从真相表的角度来看,这是一个不可能的状态.

是的,它有效,是的,我可以忍受它.但是我想知道c#中是否有一些机制来避免这种代码,或者我是否错过了一些明显的东西?

更新:
对于奖励积分,纯粹出于好奇,是否有任何语言以不同的方式处理这类事情?也许这不是一个语言问题,而是一个智能编译器(但我认为边缘情况将是难以想象的复杂).

.net c# exception-handling exception truthtable

11
推荐指数
3
解决办法
414
查看次数

MVC4需要哪些程序集?

在MVC4模板中,许多(...很多!)程序集被添加到项目中,即使对于"空"模板也是如此.

哪些是真正必要的,每个人实际上做了什么 - 我找不到任何地方的列表?我只想参考我需要的那些.

我创建了一个"空"的项目,并开始由一个去除它们,但它很快得到,因为相关的web.config变化等繁琐(和休息)

deployment asp.net-mvc asp.net-mvc-4

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

使用自定义FluentValidator验证程序验证枚举

我创建了一个自定义验证器,它测试一个值在枚举的有效值范围内:

public class IsInEnumValidator<T> : PropertyValidator {
  public IsInEnumValidator() : base("Property {PropertyName} it not a valid enum value.") { }
  protected override bool IsValid(PropertyValidatorContext context) {
    if (!typeof(T).IsEnum) return false;
    return Enum.IsDefined(typeof(T), context.PropertyValue);
  }
}
Run Code Online (Sandbox Code Playgroud)

以及链接验证器的扩展方法:

public static IRuleBuilderOptions<T, TProperty> IsInEnum<T, TProperty>(this IRuleBuilder<T, TProperty> ruleBuilder) {
  return ruleBuilder.SetValidator(new IsInEnumValidator<TProperty>());
}
Run Code Online (Sandbox Code Playgroud)

我想使用它像这样:

RuleFor(x => x.Day).IsInEnum<DayOfWeek>();
Run Code Online (Sandbox Code Playgroud)

我的问题:

  1. 这不能按预期工作,因为我需要speficy ....IsInEnum<T, DayOfWeek>()而不是所需的....IsInEnum<DayOfWeek>();.我该如何实现这一目标?

  2. 我想测试这个自定义验证器 - 不是用这个验证器测试我的数据,而是测试验证器本身.该库的文档解释了如何测试数据,而不是如何测试自定义验证器.库中似乎有很多测试代码,有什么我可以重用的吗?我使用NUnit.

c# testing lambda unit-testing fluentvalidation

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

路由测试ASP.NET MVC4

我一直在使用MvcRouteUnitTester(codeplexnuget)来对我的路线运行自动单元测试.尝试它可以做什么:

// assert incoming route
tester.WithIncomingRequest("/Foo").ShouldMatchRoute("Foo", "Index");
tester.WithIncomingRequest("/Foo/Index").ShouldMatchRoute("Foo", "Index");

// assert outgoing route
tester.WithRouteInfo("Foo", "Index").ShouldGenerateUrl("/Foo");
Run Code Online (Sandbox Code Playgroud)

它工作得很好......当它工作时.它与MVC4兼容,并且很长时间没有更新.

是否有与最新MVC一起使用的替代工具,并得到积极支持?

asp.net-mvc unit-testing asp.net-mvc-routing asp.net-mvc-4

7
推荐指数
2
解决办法
3232
查看次数