所以,我在这里查看了一些关于规范模式的帖子,但还没有找到答案.
我的问题是,在一个n层架构中,我应该在哪些规范中获得"新建"?
我可以将它们放在我的服务层(也就是说,应用层,它有时被称为......基本上,.aspx代码隐藏的东西会与之交谈),但我觉得通过这样做,我让业务规则漏掉了域名.如果以其他方式(除了服务层)访问域对象,则域对象无法强制执行自己的业务规则.
我可以通过构造函数注入将规范注入到我的Model类中.但同样,这感觉"错误".我觉得唯一应该注入Model类的是"服务",比如缓存,日志记录,脏标记跟踪等等......如果你能避免它,那么使用Aspects而不是乱丢模型的构造函数具有大量服务接口的类.
我可以通过方法注入(有时称为"Double Dispatch")注入规范,并明确地使用该方法封装注入的规范以强制执行其业务规则.
创建一个"域服务"类,它将通过构造函数注入获取规范,然后让服务层使用域服务来协调Domain对象.这对我来说似乎没问题,因为规范强制执行的规则仍然在"域"中,而Domain Service类的命名方式与它正在协调的Domain对象非常相似.这里的事情是我觉得我正在编写大量的类和代码,只是为了"正确"实现规范模式.
除此之外,相关规范要求存储库以确定它是否"满意".
这可能会导致性能问题,尤其是 如果我使用构造函数注入b/c消耗代码可以调用一个可能包装规范的属性,并且反过来调用数据库.
所以任何想法/想法/链接到文章?
新产品和使用规格的最佳位置在哪里?
domain-driven-design specification-pattern n-layer application-layer
Ping实用程序在网络层上方工作,DNS在Application层中工作.
如果我们尝试ping www.google.com
它是如何解析GOOGLE的IP地址的,因为DNS在这些层之上?
在阅读这篇文章(业务逻辑数据库或应用程序层)之后,我仍然没有足够的理由来对抗"数据库中的业务逻辑"主题.
在我目前的工作中,有很多db事务(实际上)和所有那些糟糕的代码很难维护,存储过程中有很多重复,所以如果你想在表中稍微改一个值,你会需要找到所有这些程序并将其更改为您想要的程序.如果你需要改变一点桌面设计,也会发生同样的情况.
所有当前的开发人员都非常了解SQL,但他们仍然不是任何DATABASE的专家作为引擎(8个开发者).
目前,我们计划将整个核心迁移到新版本(包括数据库设计).我需要一些例子:
应用程序语言:Java
数据库:Oracle11g
该应用程序将具有服务,作为HTTP页面和Web服务.
在我的工作中,我们正在编写由应用程序调用的Web服务.我们正在使用域驱动设计进行敏捷思维设置.与在DDD中一样,我们有域和应用层.但是,我们在为这些层编写单元测试时遇到了问题,因为我们似乎正在测试域逻辑两次:在域单元测试中和在应用程序单元测试中:
申请单元测试
[TestMethod]
public void UserApplicationService_SignOut_ForExistingUserWithBalance_ShouldClearBalanceAndSignOut()
{
//Arrange
long merchantId = 1;
long userId = 1;
var transactionId = "001";
var id = "122";
var user = Help.SetId<User>(User.Register(id, new DateTime(2015, 01, 01, 00, 00, 01)), userId);
_usersDb.Add(user);
var userBonusBalanceRepository = _testContext.MoqUnitOfWork.MockUnitOfWork.Object.GetUserBonusAccountRepository();
UserBonusAccount uba = userBonusBalanceRepository.GetForUser(user);
uba.PayTo(
new Domain.Core.Money { TotalAmount = 10, BonusAmount = 0 },
new Domain.Core.Outlet
{
BonusPercentage = 50,
IsLoyalty = true,
Id = id,
OutletId = "111"
},
transactionId,
DateTime.Now);
userBonusBalanceRepository.Update(uba);
//Act
_testContext.UserApplicationService.SignOut(id);
//Assert
var firstOrDefault …Run Code Online (Sandbox Code Playgroud) 所以,我在这里看到了一些关于它的问题,但没有一个是关于它的具体问题,也没有回答我的疑问.
在分层架构/ DDD应用程序中,控制器(常见MVC应用程序中的"C")在哪个层中适合?我在不同的地方读过它可能在UI层或应用程序层中,但我仍然无法绕过正确的层.
我正在阅读埃里克埃文斯的DDD,直到我达到这本书的那一点我还想不通.我注意到他说如果UI层不复杂,你可以将它与应用层合并.这会对控制器产生相同的影响吗?
domain-driven-design controller presentation-layer n-tier-architecture application-layer
我最近得到了Scott Miller和Nick Tune的一本关于领域驱动设计的模式,原理和实践.它在C#中有一些很好的例子,所以与我之前读过的其他DDD书籍有点不同.由于C#支持委托和事件,Domain事件实现非常简洁.
但是,有一件事让我担心,正如本书在应用服务一章中所说的那样,它应该是"程序式的,薄的".我知道应用程序层应该很薄,但为什么程序化?我不想写程序代码,或者我不会首先选择DDD.我还发现这个stackoverflow文章还标签Application Services是程序代码:
所以你看?应用程序服务是程序式的,而不是OOP.这让我想知道是否可以通过OO接口替换应用程序服务的过程接口来将设计改进为更多OO.本文建议方法对象可以,并且它有效吗?有哪些OO替代程序应用程序服务?谁能详细说明?
http://ayende.com/blog/2145/entities-services-and-what-goes-between-them
我正在使用具有以下层的Entity Framework 6在WinForms应用程序上工作:
当用户从UI单击"保存"按钮时,它将调用"应用程序"层中的应用程序服务并传入请求.然后,应用程序服务使用该请求调用域服务.域服务调用域模型中的多个实体,以对请求中使用的数据执行验证.
域模型中的一个或多个验证需要来自存储库的信息,以确定从表示层接收的请求中的数据是否符合某些业务规则.
我正在考虑两个方案来解决这个问题.
让应用程序服务从存储库中检索所需的信息以进行验证,并将这些值传递给域服务,域服务将调用域模型和实体来验证传入的规则和值请求.然后,当域服务完成其验证时,让Application Service保存请求,这将导致将控制权返回给同步等待验证完成的应用程序服务.如果我这样做,那么域层将没有对存储库的直接或间接(注入)引用.如果我这样做,域服务的单元测试会更容易,因为没有注入任何内容来执行验证.它所需要的一切都已经传入.缺点是一些业务知识被放入应用服务,因为现在它需要知道要检索哪个存储库信息以验证请求.
在调用域服务以验证请求时,请将Application Service的实例注入其中.然后,域服务可以使用注入的应用程序服务从存储库获取信息,其服务合同在域层中定义.一旦所有信息都可用,它将根据需要传递给各个实体以验证规则和值.验证完成后,域服务使用注入的应用程序服务保存请求.域服务完成并退出后,它会将保存操作的状态返回给已等待验证完成的应用程序服务.然后,外部等待应用程序服务可以将保存结果返回给UI.我在这里遇到的一个问题是,在对域服务进行单元测试时,我将不得不模拟注入的应用服务.
哪个选项或其他行动方案可以更好地解决?提前致谢.
domain-driven-design entity-framework dependency-injection application-layer business-layer
我知道清理是件好事.我也理解操作系统内部,所以如果我知道我的进程正在终止,那么它的内存将被释放.但我想提出不同的观点.我觉得在退出时释放内存是相当不错的想法.
例如,我可能已经分配了当前换出的大内存,如果我在退出时释放它,则需要将其带到RAM,然后释放它.如果我不这样做,退出时只需在一张桌子上标记为免费.
总的来说,操作系统已经发生了很大的变化(基础知识保持不变),我理解这个问题可以被认为是A_VERY_PLATFORM_DEPENDENT,但是从今天的应用程序开发人员的角度来看,他要么陷入某些框架,要么被困在某个框架中,或者是daredevil编码器,正在研究原始技术作为COM,非常依赖,我会称之为VERY_CONTROLLED_ENVIRONMENT.
对于TL;DR:在现代操作系统上,我认为我不应该在退出时执行清理.如果你认为我错了,为什么?
PS:我不是在谈论RTOS,我的意思是受控环境意味着Windows,Linux和我从未意味着设备驱动程序开发或操作系统开发.