我放弃了传统的DDD,这通常是一个巨大的时间,并迫使我做无尽的映射:data layer <--> domain layer <--> presentation layer
.
即使是一个小小的改变,我必须改变数据模型,领域模型,表示模型/视图模型,然后是存储库,经理/服务类,当然还有AutoMapper映射,然后测试整个事情!每次调用都需要调用一个层,该层调用一个调用底层代码的层.除了"你将来可能需要它"之外,我得不到任何回报.咩.
我目前的做法更务实:
问题:我现在使用遍布各处的实体,因此客户端代码可以看到它们的导航属性.并且模型在离开存储库后始终具体化,因此这些导航属性通常为空.
可能的解决方案:
1.与之共存.它很丑,但比上面解释的问题更好.
2.对于每个实体,定义一个隐藏导航属性的接口; 并使客户端代码使用接口.但具有讽刺意味的是,这意味着另一层(尽管很薄且易于管理).
还有什么?
我不习惯这种快速和松散的编程风格,所以也许我错过了一些明显的技巧.还有什么我应该考虑的吗?我相信我很快就会遇到其他问题.
编辑: 这个问题与DDD无关.并且注意到很多人都在使用传统的DDD方法--Saymann似乎得出了相同的结论,Rahien谈到了"抽象反模式的无用抽象",而Evans自己说DDD只在5%的情况下真正有用.案例.另见这个帖子.一些评论/答案可以预见我将如何做DDD错误,或者我如何调整我的系统来做正确的事.但是,我并不是要问DDD还是在适合的情况下抨击它,而是我想知道其他人在做什么符合我上面所描述的思路.这并不是说DDD是所有设计弊病的灵丹妙药,每十年都有一个新的流程出现(RUP任何人?XP,Agile,Booch,等等......).DDD是最新的,也是最知名和最常用的.但实用主义应该是第一位的,因为我正在努力建造能够按时发货且易于维护的可销售产品.到目前为止,我学到的最有用的编程公理是YAGNI.我想要的是将我的系统改为某种"DDD-lite",在这里我得到了强大的设计/ OOP /模式哲学,但没有脂肪.
我为谷歌地图使用了一个jQuery库,它取决于首先加载的谷歌脚本.我希望能够在包中包含这两个:
bundles.Add(new ScriptBundle("myfoobundle").Include(
"http://maps.googleapis.com/maps/api/js?sensor=false&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&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
我的项目结构如下所示:
MVC4 Web项目的默认输出目录是.\Bin\
(即在Web项目的目录中),但我将其更改为类似..\bin\debug\
或..\bin\release\
适合我的上述项目结构.编译好,二进制文件到正确的位置.
但是,当我运行该项目时,它抱怨说Could not load type Myproject.MvcApplication
,如果我不进行上述更改,那么它可以工作.
如何控制二进制文件的位置?我希望输出目录与源目录完全分离 - 它更容易部署和更安全,因为我没有在一个地方混合使用源代码和二进制文件.
如何在创建日历后设置minTime
和maxTime
选项?
我尝试了以下,但不起作用:
$('#calendar').fullCalendar('option', 'minTime', 7);
$('#calendar').fullCalendar('render');
Run Code Online (Sandbox Code Playgroud) 我正在尝试使用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
我正在尝试在我的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>>
,但我不能将表达式组合在一起进行复杂的过滤.如果可能的话,我宁愿避免使用外部库.
更新:
如果无法做到这一点,我有什么选择?也许以某种方式组合/或/和表达表达式以达到同样的效果?
考虑一下这个函数,您可以将其视为真值表:
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#中是否有一些机制来避免这种代码,或者我是否错过了一些明显的东西?
更新:
对于奖励积分,纯粹出于好奇,是否有任何语言以不同的方式处理这类事情?也许这不是一个语言问题,而是一个智能编译器(但我认为边缘情况将是难以想象的复杂).
在MVC4模板中,许多(...很多!)程序集被添加到项目中,即使对于"空"模板也是如此.
哪些是真正必要的,每个人实际上做了什么 - 我找不到任何地方的列表?我只想参考我需要的那些.
我创建了一个"空"的项目,并开始由一个去除它们,但它很快得到,因为相关的web.config变化等繁琐(和休息)
我创建了一个自定义验证器,它测试一个值在枚举的有效值范围内:
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)
我的问题:
这不能按预期工作,因为我需要speficy ....IsInEnum<T, DayOfWeek>()
而不是所需的....IsInEnum<DayOfWeek>();
.我该如何实现这一目标?
我想测试这个自定义验证器 - 不是用这个验证器测试我的数据,而是测试验证器本身.该库的文档解释了如何测试数据,而不是如何测试自定义验证器.库中似乎有很多测试代码,有什么我可以重用的吗?我使用NUnit.
我一直在使用MvcRouteUnitTester(codeplex和nuget)来对我的路线运行自动单元测试.尝试它可以做什么:
// 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 ×6
c# ×3
unit-testing ×2
.net ×1
deployment ×1
exception ×1
fullcalendar ×1
lambda ×1
linq ×1
poco ×1
testing ×1
truthtable ×1