小编Joh*_*ohn的帖子

在域驱动设计(DDD)中建模查找表的实用方法是什么?

我刚刚学习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一样.

我的结论:

  1. 查找表永远不是值对象,因为查找表总是具有标识.如果他们没有身份,你就会有重复,这没有多大意义.
  2. 只读查找表可以有一个存储库,但可能不需要存储库.存储库的目标是通过仅通过聚合强制访问来降低复杂性.通过聚合为您提供了一种确保可以实施业务规则的方法,例如,如果您没有汽车,则不会添加轮胎.
  3. 如果您在查找表上允许CRUD维护,那么查找表有自己的存储库是有意义的.
  4. 我最终将代码存储为结构的事实并没有使它们成为"值类型".Fowler在POEAA中说结构是一种价值类型.这是真的,结构是不可变的,这就是福勒说它们是"价值类型"的原因,但是我使用它们的方式不同.我使用结构作为一种轻量级方式来传递DTO,这些DTO在我们最初的创建之后并没有计划改变.事实上,我所使用的结构确实具有同一性,但由于它们是只读的,因此它们起到了结构的作用.
  5. 我一直在使用的一种模式,我在其他地方看不到的是使主键字段不可变.它们由构造函数设置,但它们是只读的(不是私有访问器),并且在创建对象后无法更改.

lookup domain-driven-design

43
推荐指数
2
解决办法
6469
查看次数

如何在ASP.Net MVC中对自定义ActionFilter进行单元测试

所以我正在创建一个自定义的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.

我的问题是:我该如何测试?

  1. 我写什么测试?我是TDD新手,并不是100%确定我应该测试什么以及不测试什么.我想出了AcceptsTypeFilterJson_RequestHeaderAcceptsJson_ReturnsJson(),AcceptsTypeFilterXml_RequestHeaderAcceptsXml_ReturnsXml()AcceptsTypeFilter_AcceptsHeaderMismatch_ReturnsError406().
  2. 如何在MVC中测试正在测试Http Accept Headers的ActionFilter?

谢谢.

tdd asp.net-mvc unit-testing actionfilterattribute

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

如何使用HTML Agility Pack编辑HTML片段

所以我有一个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,但我不知道我要去哪里.特别是,

  1. 如何将部分片段加载为字符串,而不是完整的HTML文档?
  2. 怎么编辑?
  3. 然后如何返回已编辑对象的文本字符串?

c# html-agility-pack

15
推荐指数
1
解决办法
1万
查看次数

如何在服务器端分页中使用DataPager?

我正在尝试使用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)

asp.net server-side datapager

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

使用Ajax,您如何跨域触发和忘记

我想对Web服务进行一次即发即弃的jQuery调用.

基本上,我想发送一个JSON对象http://myservice.com/uservisits/create,我不关心接收任何类型的返回响应.但是,我们希望为我们的几个域使用相同的服务,这意味着要遇到与Ajax相关的跨域限制.

你怎么做到这一点?JSONP上有很多这样的东西,但我不需要处理响应.我觉得我错过了一个明显的细节.

ajax jquery cross-domain

10
推荐指数
1
解决办法
1203
查看次数

在ASP.Net MVC中,ModelState可以与ajax更新一起使用吗?

这是我之前关于将错误传递回客户端的前一个问题的后续内容,但也与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)

error-handling asp.net-mvc jquery

9
推荐指数
1
解决办法
1万
查看次数

SQL Server和Mongo可以一起使用吗?

我们有一个面向新闻的大型网站,网站流量很高.该体系结构是您经常看到的DB - Repo Layer - Services Layer - Asp.Net MVC.我们一直看到的问题是读取性能.事实证明,所有这些DDD域对象在理论上对于业务规则来说都很棒,但在优化读取性能方面却让生活更加艰难.

作为一个解决方案,我正在考虑一些全新的东西(对我们来说):使用noSQL.我想在我们的网站上使用noSQL数据库来显示数据.我们无法摆脱我们的SQL Server(至少不会很快),但在我看来,实际的一步是将Mongo用作所有新开发的查询数据库.

我的问题是,是否可以将SQL Server用作记录数据库,将Mongo用作查询数据库,如果是这样,您将使用哪种技术/技术来更新更新?我希望Mongo能够在15分钟内恢复精力.

sql-server mongodb nosql

9
推荐指数
1
解决办法
5522
查看次数

我应该使用哪种ORM工具进行.Net开发

我的公司希望在.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,它运行得很好.

nhibernate orm llblgenpro

8
推荐指数
1
解决办法
1964
查看次数

在ASP.Net MVC中,如何创建将javascript和css放在应该去的位置的小部件?

我试图在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页面中重复使用这个小部件.我想出了几个选项,包括:

  1. 创建一个HTML帮助器
  2. 的RenderPartial
  3. 的RenderAction
  4. 从窗口小部件文件中删除所有css和javascript依赖项.手动复制并粘贴到我在正确位置使用它的每个视图.

当我记得Steve Souders关于网站性能的规则时,我正准备使用帮助器:

规则5:将样式表放在顶部

规则6:将脚本放在底部

选项1),2)和3)看起来都是好主意,但它们都是内联编写代码并违反了性能规则.选项4)允许我手动将javascript和css文件放在它们所属的位置,但复制和粘贴容易出错.一个潜在的想法是写一个脚手架,把所有东西放在它所属的地方,但这似乎现在太多了.

什么是最好的(希望很简单)做小部件的方式,仍然遵循性能规则5和6?

asp.net-mvc performance widget

8
推荐指数
1
解决办法
1780
查看次数

我们应该使用什么源代码控制

我正在寻找一个好的源控制解决方案.以下是要求:

  1. 必须具有GUI或具有可用的GUI插件.
  2. 必须是免费的.
  3. 必须使用HTTP.

你会选择什么源代码控制?

背景

我们的.Net开发团队是大型母公司的一部分.我们正在收购VS团队系统,但是大公司的官僚主义行动缓慢,可能需要几个月才能启动并运行Team System服务器.与此同时,我们有一个大型项目将外包给印度的供应商.在过去,我们团队的流程是这样的:1)指定要求,2)让印度团队创建解决方案,3)在一个月后从供应商处收回解决方案.

我们正在寻找一种更有纪律的方法,团队系统是我们的长期解决方案,但是我想现在就使用一些东西而不是什么.

以下是我的一些想法:

  1. 由于稳定性问题,Source Safe是不可行的.
  2. 易用性比高级功能更重要,比如分支,我真的希望它使用GUI而不是命令行.
  3. HTTP访问是必须的,因为开发团队将是远程的.

附加信息作为迄今为止反馈的后续行动

我们需要一个免费的解决方案,不是因为我们负担不起,而是因为公司的企业采购政策会延迟实现.免费使我们可以随时安装.我想如果它足够便宜,我可以自己掏钱,但它必须相当便宜.

最后

遗憾的是,我们最终没有使用任何建议.我们最终获得了TFS许可证,但是我们预计在明年之前不会有使用服务器的许可.在此期间,离岸团队将zip文件上传到ftp服务器上.Ugggghh!为什么说服大公司可以使用非标准解决方案(如GIT)而不是等待几个月(或几年),因为他们试图决定是否购买(在这种情况下是TFS)值得.

version-control

6
推荐指数
2
解决办法
1175
查看次数