我刚刚学习DDD(Eric Evans的书在我面前开放),我遇到了一个我无法找到答案的问题.当您只是想获得一个简单的查找记录列表时,您在DDD中做了什么?
防爆.
EmployeeID:123
EmployeeName:John Doe
State:Alaska(下拉列表)
县:Wasilla(下拉 - 将根据州进行过滤).
例如,假设您有一个Employee域对象,一个IEmployeeRepository接口和一个EmployeeRepository类.UI将使用它来显示员工列表和个人详细信息.在UI中,您希望使用员工所在州和郡的下拉列表.将根据选择的状态筛选可用县.
不幸的是,数据库表和UI看起来非常不同.在tblEmployees中,它包含州代码= AK和县代码= 02130,而不是州和县名称.
旧的方式(在我开始此DDD任务之前)将非常简单,只需创建2个查询并使用DataReader填充下拉列表.下拉列表中显示的下方是值,它会自动用于表单帖子.
但是,对于DDD,我不确定你应该怎么做.我首先开始创建State和County对象以及存储库的存储库和接口.但是,编写4个类+2个接口以及hbm.xml文件和Employee Business对象中的管道对于2个下拉列表的2个查询来说似乎有些过分.必须有更好的方法,不是吗?我不会很快改变州或县表中的记录,即使我这样做,也不会通过这个应用程序.因此,如果我不需要,我真的不想为State和County创建业务对象.
我看到的最简单的解决方案是使用返回字典的方法创建一个辅助类,例如GetStatesAll(),GetState()和GetCounties()以及GetCounty(),但从DDD的角度来看,这感觉不对.
请帮忙.如何在没有过度设计的情况下使用DDD只需几个简单的查找?
最终解决方案 我认为我终于通过经验找到了答案,即将GetStates()方法放入自己的Data Access类中,尽管不是存储库类.由于我只进行只读访问,因此我将其放入结构DTO中.由于数据库很小,我把它们完全扔进了一个类,就像下面描述的Todd一样.
我的结论:
所以我正在创建一个自定义的ActionFilter,它主要基于这个项目http://www.codeproject.com/KB/aspnet/aspnet_mvc_restapi.aspx.
我想要一个自定义操作过滤器,它使用http接受标头返回JSON或Xml.典型的控制器操作如下所示:
[AcceptVerbs(HttpVerbs.Get)]
[AcceptTypesAttribute(HttpContentTypes.Json, HttpContentTypes.Xml)]
public ActionResult Index()
{
var articles = Service.GetRecentArticles();
return View(articles);
}
Run Code Online (Sandbox Code Playgroud)
自定义筛选器会覆盖OnActionExecuted,并将对象(在此示例文章中)序列化为JSON或Xml.
我的问题是:我该如何测试?
AcceptsTypeFilterJson_RequestHeaderAcceptsJson_ReturnsJson()
,AcceptsTypeFilterXml_RequestHeaderAcceptsXml_ReturnsXml()
和AcceptsTypeFilter_AcceptsHeaderMismatch_ReturnsError406()
.谢谢.
所以我有一个HTML代码片段,我想用C#修改.
<div>
This is a specialSearchWord that I want to link to
<img src="anImage.jpg" />
<a href="foo.htm">A hyperlink</a>
Some more text and that specialSearchWord again.
</div>
Run Code Online (Sandbox Code Playgroud)
我想把它转换成这个:
<div>
This is a <a class="special" href="http://mysite.com/search/specialSearchWord">specialSearchWord</a> that I want to link to
<img src="anImage.jpg" />
<a href="foo.htm">A hyperlink</a>
Some more text and that <a class="special" href="http://mysite.com/search/specialSearchWord">specialSearchWord</a> again.
</div>
Run Code Online (Sandbox Code Playgroud)
我将根据这里的许多建议使用HTML Agility Pack,但我不知道我要去哪里.特别是,
我正在尝试使用DataPager进行服务器端分页.这是我的代码
<asp:DataPager ID="pgrFooBars" PagedControlID="lvFooBars"
QueryStringField="page" runat="server" >
<Fields>
<asp:NumericPagerField />
</Fields>
</asp:DataPager>
Run Code Online (Sandbox Code Playgroud)
代码背后
protected void Page_Load(object sender, EventArgs e)
{
ConfigureBlogPostListView();
}
private void ConfigureBlogPostListView()
{
int pageNum;
int.TryParse(Request.Params["page"], out pageNum);
int pageSize = 20;
PagedList<IFooBar> FooBars = FooService.GetPagedFooBars(
new PagingSettings(pageNum, pageSize));
ListViewPagedDataSource ds = new ListViewPagedDataSource();
ds.AllowServerPaging = true;
ds.DataSource = FooBars;
ds.MaximumRows = pageSize;
ds.StartRowIndex = pageNum;
//TotalCount is the total number of records in the entire set, not just those loaded.
ds.TotalRowCount = FooBars.TotalCount;
lvFooBars.DataSource = ds; …
Run Code Online (Sandbox Code Playgroud) 我想对Web服务进行一次即发即弃的jQuery调用.
基本上,我想发送一个JSON对象http://myservice.com/uservisits/create
,我不关心接收任何类型的返回响应.但是,我们希望为我们的几个域使用相同的服务,这意味着要遇到与Ajax相关的跨域限制.
你怎么做到这一点?JSONP上有很多这样的东西,但我不需要处理响应.我觉得我错过了一个明显的细节.
这是我之前关于将错误传递回客户端的前一个问题的后续内容,但也与ModelState有关.
有没有人成功使用过Nerd Dinner方法,但是使用Ajax?因此,书呆子晚餐会更新.
[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Edit(int id, FormCollection formValues)
{
Dinner dinner = dinnerRepository.GetDinner(id);
try
{
UpdateModel(dinner);
dinnerRepository.Save();
return RedirectToAction("Details", new { id=dinner.DinnerID });
}
catch
{
foreach (var issue in dinner.GetRuleViolations()) {
ModelState.AddModelError(issue.PropertyName, issue.ErrorMessage);
}
return View(dinner);
}
}
Run Code Online (Sandbox Code Playgroud)
使用jQuery $ .ajax
function hijack(form, callback, errorFunction, format) {
$.ajax({
url: form.action,
type: form.method,
dataType: format,
data: $(form).serialize(),
success: callback,
error: function(xhr, textStatus, errorThrown) {
errorFunction(xhr, textStatus, errorThrown);
}
});
}
Run Code Online (Sandbox Code Playgroud)
Ajax,控制器的"尝试"部分
try
{
UpdateModel(dinner);
dinnerRepository.Save();
return …
Run Code Online (Sandbox Code Playgroud) 我们有一个面向新闻的大型网站,网站流量很高.该体系结构是您经常看到的DB - Repo Layer - Services Layer - Asp.Net MVC.我们一直看到的问题是读取性能.事实证明,所有这些DDD域对象在理论上对于业务规则来说都很棒,但在优化读取性能方面却让生活更加艰难.
作为一个解决方案,我正在考虑一些全新的东西(对我们来说):使用noSQL.我想在我们的网站上使用noSQL数据库来显示数据.我们无法摆脱我们的SQL Server(至少不会很快),但在我看来,实际的一步是将Mongo用作所有新开发的查询数据库.
我的问题是,是否可以将SQL Server用作记录数据库,将Mongo用作查询数据库,如果是这样,您将使用哪种技术/技术来更新更新?我希望Mongo能够在15分钟内恢复精力.
我的公司希望在.Net中使用ORM进行新的开发.我们目前正在关注nHibernate,因为它很受欢迎,但LLBLGen是我们可能考虑的另一种选择.成本不是主要因素.我们需要一个解决方案,提供域模型与数据库的良好分离,良好的缓存策略,开发效率(即如果我可以在GUI中编辑它而不是配置文件,那么好),良好的客户支持.
我知道nHibernate非常受欢迎,但我也知道价格(它是免费的)可能是开源类型的原因之一.由于成本不是主要因素(除非价格> 10,000美元),根据我们的情况,您会选择哪种?另外,除了我列出的因素之外,您认为在选择ORM时最重要的其他因素是什么?
解析度
我们最终决定将NHibernate作为一种解决方案,但事后看来,我认为如果我们重新做一遍,我会选择LL.我刚刚找不到xml映射文件.我为NHibernate找到的代码生成器留下了很多不足之处.我确实发现Fluent NHibernate是一个有趣的开发,但我宁愿在使用之前先等待它成熟.
事实证明,我学习过程中最重要的部分不是技术,而是两种设计模式:存储库和分离的界面模式.通过定义用于数据访问的存储库接口(Jeffrey Palermo上有许多博客文章以及Apress和Wrox MVC书籍也显示了这一点),我们可以使用LinqtoSQL,LLBLGen,NHibernate等,并交换DAL实现稍后如果我们改变.因此,当我的一个同事在他的应用程序上使用NHibernate时,我选择在我最近的应用程序上使用LinqToSQL,它运行得很好.
我试图在ASP.Net MVC中创建一个可重用的小部件.这是一个将2个日期连接成字符串的小部件.该小部件包含3个文件:Widget.cshtml,Widget.css和Widget.js以及几个jquery库的依赖项.
Widget.cshtml
<h2>Create a date range</h2>
<div>
<label for="startDate">Start:</label>
<input id="startDate" class="date" name="startDate" type="text" />
</div>
<div>
<label for="endDate">End:</label>
<input id="endDate" class="date" name="endDate" type="text" />
</div>
<p id="output"></p>
<button id="createDateRange">Create</button>
Run Code Online (Sandbox Code Playgroud)
Widget.css
label { color: #555;}
Run Code Online (Sandbox Code Playgroud)
Widget.js
$(function () {
$(".date").datepicker();
$("#createDateRange").click(function () {
var start = $("#startDate").val();
var end = $("#endDate").val();
$("#output").html(start + " to " + end);
});
});
Run Code Online (Sandbox Code Playgroud)
我想在我的MVC页面中重复使用这个小部件.我想出了几个选项,包括:
当我记得Steve Souders关于网站性能的规则时,我正准备使用帮助器:
规则5:将样式表放在顶部
规则6:将脚本放在底部
选项1),2)和3)看起来都是好主意,但它们都是内联编写代码并违反了性能规则.选项4)允许我手动将javascript和css文件放在它们所属的位置,但复制和粘贴容易出错.一个潜在的想法是写一个脚手架,把所有东西放在它所属的地方,但这似乎现在太多了.
什么是最好的(希望很简单)做小部件的方式,仍然遵循性能规则5和6?
我正在寻找一个好的源控制解决方案.以下是要求:
你会选择什么源代码控制?
背景
我们的.Net开发团队是大型母公司的一部分.我们正在收购VS团队系统,但是大公司的官僚主义行动缓慢,可能需要几个月才能启动并运行Team System服务器.与此同时,我们有一个大型项目将外包给印度的供应商.在过去,我们团队的流程是这样的:1)指定要求,2)让印度团队创建解决方案,3)在一个月后从供应商处收回解决方案.
我们正在寻找一种更有纪律的方法,团队系统是我们的长期解决方案,但是我想现在就使用一些东西而不是什么.
以下是我的一些想法:
附加信息作为迄今为止反馈的后续行动
我们需要一个免费的解决方案,不是因为我们负担不起,而是因为公司的企业采购政策会延迟实现.免费使我们可以随时安装.我想如果它足够便宜,我可以自己掏钱,但它必须相当便宜.
最后
遗憾的是,我们最终没有使用任何建议.我们最终获得了TFS许可证,但是我们预计在明年之前不会有使用服务器的许可.在此期间,离岸团队将zip文件上传到ftp服务器上.Ugggghh!为什么说服大公司可以使用非标准解决方案(如GIT)而不是等待几个月(或几年),因为他们试图决定是否购买(在这种情况下是TFS)值得.
asp.net-mvc ×3
jquery ×2
ajax ×1
asp.net ×1
c# ×1
cross-domain ×1
datapager ×1
llblgenpro ×1
lookup ×1
mongodb ×1
nhibernate ×1
nosql ×1
orm ×1
performance ×1
server-side ×1
sql-server ×1
tdd ×1
unit-testing ×1
widget ×1