我有关于DDD和存储库模式的问题.
假设我有Customer聚合根的Customer存储库.Get&Find方法返回完全填充的聚合,其中包括Address等对象.一切都很好.但是当用户在UI中搜索客户时,我只需要聚合的"摘要" - 只是一个包含汇总信息的扁平对象.
我可以处理的一种方法是正常调用存储库中的find方法,然后在应用程序层中将每个客户聚合映射到CustomerSearchResult/CustomerInfo DTO,并将它们发送回客户端.
但我的问题是性能; 每个Customer聚合可能需要多个查询来填充所有关联.因此,如果我的搜索条件与50个客户相匹配,那么在数据库中可能会检索到我甚至不需要的数据.
另一个问题是,我可能希望在客户的聚合根边界之外包含有关客户的汇总数据,例如最后一个订单的日期.订单有自己的聚合,因此要获取客户的订单信息,我必须调用OrderRepository,这也会降低性能.
所以现在我觉得我有两种选择:
向CustomerRepository添加一个额外的Find方法,该方法通过执行一个有效的查询来返回这些摘要对象的列表.
创建一个专门构建的只读CustomerInfoRepository,它只有1中描述的find方法.
但这两种感觉都让我觉得我违背了DDD的原则.我的存储库继承自通用基础:存储库,其中T:IAggregateRoot.这些摘要信息对象不是聚合,并且与T的类型不同,所以#1真的违背了设计.
也许对于#2,我会创建一个没有IAggregateRoot约束的抽象SearchRepository?
我的域中有许多类似的场景.
你会如何实现这种情况?
谢谢,戴夫
更新
在阅读Theo的答案之后,我想我会选择#2选项并在我的基础架构中创建一个专门的SearchRepository,以适应这些场景.然后,应用程序层(WCF服务)可以调用这些直接填充摘要DTO的存储库,而不是将域实体映射到DTO.
****更新2****
虽然我在一年多前问过这个问题,但我想我只是补充说我已经发现了CQRS,它旨在解决这个问题.Udi Dahan(http://www.udidahan.com/)和Greg Young(http://codebetter.com/gregyoung/)已经写了很多关于它的文章.如果您使用DDD创建分布式应用程序,CQRS适合您!
.net c# domain-driven-design ddd-repositories repository-pattern
在上个月,我们的ASP.NET Web应用程序已停止响应请求,我们不得不重置应用程序池以使其备份.
我们无法确定问题的确切原因,因为服务器的事件日志中没有错误.该网站只是停止响应.
因此,我们一直在使用WinDbg来尝试分析在Tess Ferrandez的博客条目帮助下网站没有响应的内存转储:GC挂起和高CPU挂起
通过运行,!threadpool我可以看到以下内容:
CPU utilization: 81%
Worker Thread: Total: 10 Running: 8 Idle: 2 MaxLimit: 400 MinLimit: 160
Work Request in Queue: 1930
--------------------------------------
Number of Timers: 72
--------------------------------------
Completion Port Thread:Total: 1 Free: 1 MaxFree: 8 CurrentLimit: 0 MaxLimit: 400 MinLimit: 120
Run Code Online (Sandbox Code Playgroud)
根据Tess在悬挂博客文章中的说法,这表明我们陷入垃圾收集的中间(通常需要纳秒时间),因为处理器显示81%,这是.NET框架设置的内容虽然这是垃圾收集.它设置为this,因为当此值大于80%时,不会生成新线程.此外 - 您可以看到队列中有1930个请求,即使可能有400个工作线程只有10个.
通过运行该!threads命令,我可以看到两个PreEmptive GC设置为禁用的线程:
PreEmptive GC Alloc Lock
ID OSID ThreadOBJ State GC Context Domain Count APT Exception
10 1 18bc 00000000001b9710 …Run Code Online (Sandbox Code Playgroud) 我正在尝试使用jquery模式对话框在单击某些内容时显示部分视图异步.非常简单,有很多问题,但我似乎无法让它工作.我有模态显示,但不在中心.我读过它是因为我在显示对话框后填充div ,因此位置相对于空div而不是填充的div - 我通过显示一些静态内容证明了这一点,它很好.
所以现在,我首先尝试获取局部视图,然后在load()回调中显示对话框,但它不起作用.我在'dialog('open')行上出错,因为对话框方法未定义.这是我的代码:
(PS我是javascript/jQuery的新手,很抱歉,如果这很明显)
<script type="text/javascript">
$(function () {
$('#my-dialog').dialog({
autoOpen: false,
width: 400,
resizable: false,
modal: true
});
});
$(document).ready(function() {
$('#show-modal').click(function() {
$('#my-dialog').load("@Url.Action("MyActionOnController")", function() {
$('#my-dialog').dialog('open');
});
return false;
});
});
</script>
<div id="my-dialog"></div>
<a href="#" id="show-modal">Click Me </a>
Run Code Online (Sandbox Code Playgroud)
帮助赞赏!
编辑我已经更改了代码以匹配Darin并上传了一个图像,显示问题出现了什么?

据我所知,Glass Mapper v4现在可以与任何IoC容器一起使用.但我很难找到如何实现这一目标的代码示例.
我希望能够注册玻璃组件并使用Unity将它们注入我的控制器,例如:
public class SearchController : Controller
{
private readonly ISitecoreContext _context;
//Inject via Unity
public SearchController(Glass.Mapper.Sc.ISitecoreContext context)
{
_context = context;
}
}
Run Code Online (Sandbox Code Playgroud)
有人可以提供一个代码示例,说明如何将Glass与Unity连接起来?
我有一个ASP.NET(Sitecore)应用程序,日志在我们客户的生产环境中显示间歇性的SQL连接错误.例外情况如下:
Exception: System.Data.SqlClient.SqlException
Message: A network-related or instance-specific error occurred while establishing a connection to SQL Server. The server was not found or was not accessible. Verify that the instance name is correct and that SQL Server is configured to allow remote connections. (provider: Named Pipes Provider, error: 40 - Could not open a connection to SQL Server)
Source: .Net SqlClient Data Provider
at System.Data.SqlClient.SqlInternalConnectionTds..ctor(DbConnectionPoolIdentity identity, SqlConnectionString connectionOptions, SqlCredential credential, Object providerInfo, String newPassword, SecureString newSecurePassword, Boolean redirectedUserInstance, SqlConnectionString userConnectionOptions, …Run Code Online (Sandbox Code Playgroud) 我们有多个站点运行一个sitecore实例.其中一个站点要求通过外部后端系统管理用户和角色,因此,我们为每个站点配置了自定义成员资格和角色提供程序以及域.但是,由于某种原因,角色提供程序上的切换器似乎并未受到尊重.如果我以sitecore用户身份登录CMS,它仍会调用我的自定义角色提供程序来尝试为此用户获取角色,尽管角色提供程序是针对其他域配置的?
当实际用户登录到站点时,角色提供程序正常工作,但当CMS用户正在编辑页面时,它不应被命中.
在我们的Web.config中配置:
<roleManager defaultProvider="sitecore" enabled="true" cookieRequireSSL="false" createPersistentCookie="false" cookieSlidingExpiration="true" cacheRolesInCookie="false">
<providers>
<clear />
<add name="sitecore" type="Sitecore.Security.SitecoreRoleProvider, Sitecore.Kernel" realProviderName="switcher" raiseEvents="true" />
<add name="sql" type="System.Web.Security.SqlRoleProvider" connectionStringName="core" applicationName="sitecore" />
<add name="MyProvider" type="MyApp.Web.Infrastructure.Security.RoleProviders.MyProvider, MyApp.Web" applicationName="sitecore" />
<add name="switcher" type="Sitecore.Security.SwitchingRoleProvider, Sitecore.Kernel" applicationName="sitecore" mappings="switchingProviders/roleManager" />
</providers>
</roleManager>
Run Code Online (Sandbox Code Playgroud)
加上我们修补的sitecore配置:
<switchingProviders>
<roleManager>
<provider providerName="MyProvider" storeFullNames="false" wildcard="%" domains="mydomain" patch:after="provider[@providerName='sql']"/>
</roleManager>
</switchingProviders>
Run Code Online (Sandbox Code Playgroud) 我有sitecore pages/lucene文档,包含以下字段:
我正在创建搜索这些并具有以下要求:
这是我得到的:
public static Expression<Func<T, bool>> GetSearchTermPredicate<T>(string searchTerm)
where T : ISearchableItem
{
var actualPhrasePredicate = PredicateBuilder.True<T>()
.Or(r => r.Title.Contains(searchTerm).Boost(2f))
.Or(r => r.FileName.Contains(searchTerm).Boost(1.5f))
.Or(r => r.Content.Contains(searchTerm))
.Or(r => r.DocumentContents.Contains(searchTerm));
var individualWordsPredicate = PredicateBuilder.False<T>();
foreach …Run Code Online (Sandbox Code Playgroud) 几个月前,我正在玩RavenDb和Azure,我通过遵循这篇优秀的博客文章,成功地通过托管服务器角色来运行它.
但是,我刚刚创建了一个新项目并尝试再次关注该文章,但自从该博客帖子以来,它似乎与raven文件一样发生了变化.特别是:
InvalidOperation例外:"Munin文件中存储了不同数量的表".任何人都可以向我提供在工作者角色中运行RavenDB所需的步骤吗?
将RavenDB作为工作者角色运行是最好的方法,还是有更合适的方式在Azure中运行它?(它需要被多个网站使用).
我有一个ASP.NET应用程序,它动态创建一个ICS日历(使用DDay.iCal库),我可以从outlook中订阅.一切正常,但我需要能够保护日历,以便只有经过身份验证的用户才能访问它.即,当您将URL添加到Outlook中的日历时,它需要询问用户名和密码.
请记住,牛奶似乎已经实现了我需要的东西,但我似乎无法找到有关如何实现这一目标的任何信息?
我有一个渲染组件,使用Lucene索引运行搜索以填充自己.
我们定义了两个索引; 硕士和网络.在体验编辑器中,它使用主索引和实际站点的Web索引.
我们已将Web索引策略配置为onPublishEndAsync,并且我们已将主索引策略配置为syncMaster,CMS用户可以添加/编辑为此组件提供支持的Sitecore项目,并在体验编辑器中立即查看它们.
但是,当我们更改Sitecore中的数据时,似乎没有更新主索引.体验编辑器仅在我手动运行索引重建后才显示数据.
<strategies hint="list:AddStrategy">
<strategy ref="contentSearch/indexConfigurations/indexUpdateStrategies/syncMaster" />
</strategies>
Run Code Online (Sandbox Code Playgroud)
为什么索引在数据更改时不会更新?
UPDATE
所以我将建议的文件与干净安装进行了比较,它们是相同的.
我应该补充一点,我没有使用标准sitecore_master_index.我们有多个站点在sitecore的同一个实例上运行,因此我们添加了一个config include for websitename_master_index.我已将<index>节点内的配置与sitecore_master_indexin in Sitecore.ContentSearch.Lucene.Index.Master.config进行了比较,唯一的区别是<root>指向特定网站内容节点的爬虫元素,另外我们添加了一些自定义字段,但我认为这些字段不会导致问题我们可以手动重建索引吗?
我在看到showconfig.aspx这个时发现的另一个有趣的事情是:
<agent type="Sitecore.ContentSearch.Tasks.Optimize" method="Run" interval="12:00:00" patch:source="Sitecore.ContentSearch.config">
<indexes hint="list">
<index>sitecore_master_index</index>
</indexes>
</agent>
Run Code Online (Sandbox Code Playgroud)
我不确定这是否有任何意义,但我们的定制没有匹配的条目websitename_master_index?
UPDATE
我还将调试级别日志记录添加到了爬网程序
在crawling.log中我只看到以下内容:
14416 08:55:10 INFO [Index=website_master_index] Initializing SitecoreItemCrawler. DB:master / Root:/sitecore/Content/Website/Home
14416 08:55:10 INFO [Index=website_master_index] Initializing SynchronousStrategy.
Run Code Online (Sandbox Code Playgroud)
在编辑和保存项目时,日志中没有进一步提及索引,这实际上是sitecore_master_index我们没有更改配置的标准吗?
asp.net ×5
sitecore ×5
.net ×3
c# ×3
asp.net-mvc ×2
lucene ×2
lucene.net ×2
sitecore8 ×2
sitecore8.1 ×2
azure ×1
dday ×1
debugging ×1
glass-mapper ×1
hang ×1
icalendar ×1
jquery ×1
networking ×1
outlook ×1
ravendb ×1
sql-server ×1
windbg ×1