在我们的应用程序中,我们在域模型中发生更改时引发域事件.事件处理程序执行的某些任务必须在引发事件时使用的同一事务中完成,其他任务必须在此事务之外执行.
例如,
将Orderline添加到Order实体时,会引发OrderLineAdded域事件,一个域事件会更改域模型的状态(因此必须在同一事务中执行),然后在事务完成时必须更新UI.
你会如何解决这个问题?
选项1似乎令人困惑,因为事件名称必须以某种方式传达它们进出事务,但是对于域事件的选项2处理程序必须始终假定它们是在事务内同步调用的.
也许有更好的方法?
我目前正在开发一个项目,该项目使用的技术包括Silverlight,WCF,EnterpriseLibrary,Unity,LinqToSql,NUnit,.Net 3.5中的RhinoMocks
我正在培训一个新的开发人员,他有一些VB脚本和SQL的经验,但没有接触.Net
几乎100%的代码库都有单元测试覆盖率,但似乎让新的开发人员开始编写单元测试太多了,有足够的东西继续探索,没有增加单元测试和模拟的混乱.
他被分配了执行解决方案新功能的任务,这些功能贯穿于从UI到数据库的每一层,并且一如既往需要强大的客户需求,以便尽快将该功能投入生产.
您认为最好的方法是让人快速上手?
我有一个Silverlight 4解决方案,需要很长时间才能从VS2010和MSBuild 4命令行构建.
该解决方案包含42个项目,一个是Silverlight应用程序项目,一个是Web应用程序项目,其余是类库.
MSBuild诊断摘要显示这些任务需要相当长的时间......
29891 ms ResolveAssemblyReferences 68 calls
115609 ms CopySilverlightApplications 1 calls
131547 ms ValidateXaml 36 calls
425688 ms ResolveProjectReferences 68 calls
634031 ms Build 71 calls
Run Code Online (Sandbox Code Playgroud)
项目依赖项排列得很好,构建顺序看起来合理.我将所有项目编译成单个输出文件夹,并且所有引用的项目都具有CopyLocal = false.
看起来最糟糕的罪犯是ResolveProjectReferences,但为什么要花这么长时间呢?
我正在尝试将ContextMenu添加到WPF中ListBox中的项目;
<ListBox.ItemTemplate>
<DataTemplate>
<Border>
<Grid>
<Grid.ContextMenu>
<ContextMenu>
<MenuItem Header = "Menu item 1"/>
<MenuItem Header = "Menu item 2"/>
<MenuItem Header = "Menu item 3"/>
</ContextMenu>
</Grid.ContextMenu>
........
........
</Grid>
</Border>
</DataTemplate>
</ListBox.ItemTemplate>
Run Code Online (Sandbox Code Playgroud)
问题是ContextMenu只会在点击网格的实际上下文时打开,我希望能够通过单击列表框项目上的任意位置来打开菜单.
我应该将Grid包装在其他控件中吗?
我通过方法链创建了一些小的流畅接口.它们通常调用许多从Web服务/数据库获取数据的存储库.
我该如何进行使用流畅界面的单元测试方法?
Public IEnumberable<Computer> FindComputers(string serialNumber)
{
return Computers.FindBySerialNumber("YBCX00900")
.AttachConfiguration()
.EnsureAllComputersHaveConfiguration();
}
Run Code Online (Sandbox Code Playgroud)
我可以对流畅的界面的各个组件进行单元测试,但如果我想对上面的FindComputers方法进行单元测试,我该怎么办?
我想找到一种易于维护的方法.
在实现Domain事件时,事件处理程序应仅用于纯域关注; 您将与业务专家讨论的内容,或者是否可以被对域模型感兴趣的任何内容使用?
最好用一个简单的例子来解释这个问题,考虑一个Calendar应用程序来为员工安排工作.
我们可能会有以下域名事件......
AppointmentAdded AppointmentRemoved AppointmentContentChanged AppointmentMoved
我们有这些事件的处理程序,例如当约会被移动到员工工作时间之外的时间时,我们设置警告标志.
当然存在对这些事件感兴趣的应用程序问题,例如,当将约会添加到日历时,我们应该将其添加到工作单元,以便我们可以稍后提交更改.
这些应用程序问题是否应该是域事件的消费者,还是我们应该提出并处理单独的系统事件?
我有一个 WCF 服务,它跨几个数据库和 Active Directory 执行一些更新。由于 Active Directory 无法支持事务,因此我想在“DirectoryRepository”类中实现,该类将在发生回滚时执行补偿操作。
我的代码正在使用 TransactionScope ...
using(var scope = new TransactionScope())
{
AssetRepository.Add(asset);
DeploymentRepository.Add(deployment);
DirectoryRepository.Add(directoryEntry);
scope.Complete();
}
Run Code Online (Sandbox Code Playgroud)
我的 DirectoryRepository 如何知道任何当前事务并在回滚时得到通知?
我想创建一个从多个源返回数据的OData服务.出于这个原因,我不能将WCF数据服务与任何开箱即用的提供商一起使用,而且我们真的希望更多地控制数据模型.
如果我们坚持使用MS产品堆栈,我认为我们有两种选择;
将WCF与WebGet/WebInvoke一起使用以模仿OData api,并在内部执行查询字符串解析和转换.例如,对于我们的数据在Sql数据库中的情况,我们必须将$ filter子句转换为SQL where子句,以便构建我们的查询.请注意,我们在这里不能使用任何类型的ORM,因为我们的数据模型是动态的,并且我们没有任何可以用ORM填充的CLR实体类.
我们将WCF数据服务与自定义提供程序一起使用,这要求我们为资源集传递IQueryable,这使我们可以执行Select*FROM Table并使用Linq对象,或者实现我们自己的IQueryable提供程序,该提供程序支持所需的表达式由OData.WCF数据服务甚至会接受IQuerable吗?
哪个最容易实现?我们大多只想支持OData规范的$ filter功能,$ expand和$ select可以在以后使用.
放弃WCF数据服务似乎是一种耻辱,如果它可以提供解析后的OData查询,然后您可以自己转换为Linq查询,而不是期望您的数据源具有IQueryable提供程序,那将更为可取.
在这种情况下,订阅代理CloseCompleted事件是不是很糟糕?
public static void Close(this MyWCFServiceClient proxy)
{
proxy.CloseCompleted += (o, e) =>
{
if (e.Error != null)
proxy.Abort();
};
proxy.CloseAsync();
}
Run Code Online (Sandbox Code Playgroud)
当代理不再被任何代码引用时,它是否仍会被垃圾收集,或者扩展方法中的事件订阅是否仍然存在对代理的引用?
c# ×5
.net ×2
architecture ×2
unit-testing ×2
.net-4.0 ×1
contextmenu ×1
events ×1
iqueryable ×1
msbuild ×1
odata ×1
performance ×1
transactions ×1
wpf ×1
xaml ×1