我们的数据库是基于EAV(实体 - 属性 - 值)模型设计的.那些使用EAV模型的人知道为了灵活性而附带的所有垃圾.
我向我的客户询问了使用EAV模型的原因(灵活性),他们的反应是:他们的实体随着时间而变化.因此,今天他们可能有一个具有一些属性的表,但在一个月的时间内,可能会添加一些新属性,或者可能会重命名现有属性.他们需要生成报告以回到任何阶段,并根据该阶段的实体形状查询数据.
我理解这对于传统的关系模型是不可行的,但我个人认为EAV是反模式的.是否有其他替代模型使我们能够捕获实体和实例更改的时间维度?
干杯,莫什
database database-design data-modeling entity-attribute-value data-structures
我在我的DI中使用StructureMap.想象一下,我有一个类需要1个参数:
public class ProductProvider : IProductProvider
{
public ProductProvider(string connectionString)
{
....
}
}
Run Code Online (Sandbox Code Playgroud)
当我得到IProductProvider的实例时,我需要在运行时指定"connectionString" .
我已经按如下方式配置了StructureMap:
ForRequestedType<IProductProvider>.TheDefault.Is.OfConcreteType<ProductProvider>().
WithCtorArgument("connectionString");
Run Code Online (Sandbox Code Playgroud)
但是,我不想在这里调用EqualTo("something ......")方法,因为我需要一些工具来在运行时动态指定此值.
我的问题是:如何通过使用ObjectFactory获取IProductProvider的实例?
目前,我有类似的东西:
ObjectFactory.GetInstance<IProductProvider>();
Run Code Online (Sandbox Code Playgroud)
但是如你所知,这不起作用......
任何建议将不胜感激.
想象一下,我们有2项服务:产品和订单.基于我对SOA的理解,我知道每个服务都可以拥有自己的数据存储(一个单独的数据库,或同一个数据库中的一组表).但是,不允许任何服务直接触摸另一个服务的数据存储.
现在,假设我们在产品和订单服务中独立存储了产品和订单数据.在订单服务中,我们可以通过其ID识别产品.
我的问题是:使用这种架构,如何在"同一"页面上显示订单列表和产品详细信息?
我的理解是我应该从OrderService获取OrderItems列表.每个OrderItem都有一个ProductID.现在,如果我单独调用ProductService来检索有关每个产品的详细信息,那将是非常低效的.
你会如何解决这个问题?
干杯,莫什
假设我的ASP.NET应用程序正在进行4次单独的数据库调用.如果在第二次调用之后,我覆盖了BIN文件夹中的DLL,是否会阻止应用程序继续处理,从而导致第3次和第4次数据库调用失败?
莫什,非常感谢任何建议
想象一下,我有4个点的坐标,形成一个多边形.这些点在C#中使用PointF表示.如果我有2个多边形(使用8个点),我怎么知道它们是否相交?
Rectangle类有一个名为IntersectsWith的方法,但我找不到类似于GraphicsPath或Region的东西.
任何建议将不胜感激.
MOSH
任何人都可以就各种同步Write和Read数据库的方法给出一些指示吗?
什么是不同的技术,以及如何评估每个技术的可靠性,性能,实施成本等.
我需要帮助找到我的聚合根和边界.
我有3个实体:Plan,PlannedRole和PlannedTraining.每个计划都可以包含许多PlannedRoles和PlannedTraining.
解决方案1:起初我认为Plan是聚合根,因为PlannedRole和PlannedTraining在计划的上下文中没有意义.他们总是在计划之内.此外,我们有一个业务规则,即每个计划最多可以有3个PlannedRoles和5个PlannedTraining.所以我认为通过提名计划作为聚合根,我可以强制执行这个不变量.
但是,我们有一个搜索页面,用户可在其中搜索计划.结果显示了计划本身的一些属性(而不是PlannedRoles或PlannedTrainings).我想如果我必须加载整个聚合,它会有很多开销.有近3000个计划,每个计划可能有几个孩子.将所有这些对象加载到一起然后忽略搜索页面中的PlannedRoles和PlannedTraining对我来说没有意义.
解决方案2:我刚刚意识到用户还需要2个搜索页面,他们可以搜索计划角色或计划培训.这让我意识到他们正试图独立地访问这些对象并"脱离"Plan的背景.所以我认为我的初始设计错了,这就是我想出这个解决方案的方法.所以,我认为这里有3个聚合,每个实体有1个聚合.
这种方法使我能够独立搜索每个实体,并解决了解决方案1中的性能问题.但是,使用这种方法我不能强制执行前面提到的不变量.
还有另一个不变量,即只有在具有特定状态时才能更改计划.因此,我不能将任何PlannedRoles或PlannedTrainings添加到不处于该状态的计划中.同样,我不能用第二种方法强制执行这种不变量.
任何建议将不胜感激.
干杯,莫什
我需要一些有关为当前ASP.NET MVC应用程序编写集成测试的有效方法的建议.我们的架构包括:
我认为应该做的是:
单独编写所有部分的行为单元测试.因此,例如,我们应该在模拟存储库和消息队列时对服务层进行单元测试.
控制器也是如此.因此,我们模拟服务层并对Controller进行单元测试.
我的问题:
我们需要编写其他类型的集成测试吗?
我们是否仍需要使用真实的存储库和消息队列编写服务集成测试?
我们是否仍然需要使用真实服务(实际的存储库和消息队列组成)为控制器编写集成测试.
任何建议将不胜感激.
干杯
让我们考虑典型的Order和OrderItem示例.假设OrderItem是Order Aggregate的一部分,它只能通过Order添加.所以,新添加OrderItem的一个订单,我们必须通过信息库加载整个集合,添加一个新项目的订单对象,并再次坚持整个集合.
这似乎有很多开销.如果我们的订单有10个OrderItems怎么办?这样,只是为了添加一个新的OrderItem,我们不仅需要读取10个OrderItems,而且我们还应该重新插入所有这10个OrderItems.(这是Jimmy Nillson在他的DDD书中采用的方法.每次他想要坚持一个Aggregate,他清除所有子对象,然后再次重新插入它们.这可能会导致其他问题,因为孩子的ID是由于数据库中的IDENTITY列,每次都会更改.)
我知道有些人可能会建议在Aggregate Root中应用Unit of Work模式,以便跟踪已更改的内容并仅提交这些更改.但这违反了持久性无知(PI)原则,因为持久性逻辑正在泄漏到域模型中.
以前有人想过这件事吗?
MOSH
persistence domain-driven-design aggregate aggregateroot persistence-ignorance
我们有一个使用通用表设计的规范化 SQL Server 2008 数据库。因此,我们有通用表(实体、实例、关系、属性等),而不是为每个实体(例如产品、订单、订单项等)设置单独的表。
我们决定使用一个单独的非规范化数据库来快速检索数据。假设它们具有不同的架构,您能否告诉我同步这两个数据库的各种技术?
干杯,莫什
database sql-server synchronization data-migration data-synchronization
假设我们有一个Order类,带有一个名为Approve的方法。调用此方法时,它将检查某些条件,然后将Order置于Approved状态或引发异常。在服务层中,我们有如下内容:
var order = _repository.Single(o => o.ID == orderID);
order.Approve();
_context.SaveChanges(); // or _session.SaveChanges();
Run Code Online (Sandbox Code Playgroud)
有2种方法可以测试此方法,我想听听您对此的见解:
解决方案1:对存储库进行存根以返回Order对象。然后断言订单处于“已批准”状态。
解决方案2:对存储库进行存根以返回模拟订单对象。断言已调用Approve()方法。
解决方案1更容易,我个人更喜欢基于状态的测试而不是基于交互的测试,因为后者可以针对实现细节,因此应避免使用。但是,我认为测试给定订单是否处于“批准”状态不是此服务方法的问题。我认为我们需要针对Order类的单独测试方法,以测试是否引发了异常或Order的状态已更改为Approved。
当我们将批准订单的职责委托给Order类本身时,解决方案2听起来很合逻辑。因此,对于此服务方法,我们可能需要进行2个测试:一个确保将批准订单的任务委派给Order类,另一个确保其保存更改。
您对此有何见解?您更喜欢哪种解决方案?
干杯
阅读有关CQS原理的人知道:
CQS声明每个方法应该是执行操作的命令,或者是将数据返回给调用者的查询,而不是两者.
说到ASP.NET MVC动作,CQS是否表明我们不应该有这样的动作?
public PartialView InsertOrder(Order order)
{
OrderService.InsertOrder(order);
return PartialView("OrderDetails", order);
}
Run Code Online (Sandbox Code Playgroud)
此方法正在更改系统的状态并返回当前状态.如果在这里应用CQS,我们应该有两个单独的操作:一个用于插入新订单,一个用于获取系统系统(如果第一个Action成功完成,应该从客户端调用).但是,这使编程变得复杂.
我想知道你对此的看法.
MOSH
aggregate ×2
asp.net-mvc ×2
database ×2
unit-testing ×2
aggregates ×1
asp.net ×1
c# ×1
constructor ×1
cqrs ×1
intersection ×1
persistence ×1
polygon ×1
service ×1
soa ×1
sql-server ×1
structuremap ×1
testing ×1