- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
背景
我正在尝试创建一个简单的应用程序,以真正理解DDD + TDD + etc的整个堆栈。我的目标是在运行时动态注入DAL存储库类。这让我
域和应用程序服务层可测试。我打算用“穷人的DI”来完成
现在...所以我将在启动附近的简单控制台应用程序中执行此操作:
//穷人的DI,在运行时注入DAL存储库类
var productRepository = new SimpleOrder.Repository.ProductRespository();
var customerRepository = new SimpleOrder.Repository.CustomerRepository();
var orderRepository = new SimpleOrder.Repository.OrderRepository();
//将构造函数注入到Application Services层的此类中,
// SimpleOrder.ApplicationFacade
OrderEntry oe =新的OrderEntry(customerRepository,orderRepository,productRepository);
为了完成这种依赖注入,我创建了三个存储库接口:
-ICustomerRepository
-IOrderRepository
-IProductRespository
典型的实现:
命名空间SimpleOrder.Domain.Interfaces
{
公共接口ICustomerRepository
{
客户GetCustomerById(int customerId);
无效SaveCustomer(客户客户);
}
}
**请注意,SaveCustomer引用了域层中定义的Customer模型类。这是其他存储库的典型特征。
但是我不确定应该在哪个项目/层中实施。解决方案中有5个项目:
SimpleOrder.ConsoleClient(演示)
-我想从此处将域的特定实现作为应用程序注入
SimpleOrder.ApplicationFacade(应用程序服务)
-块状的高级,粗粒度方法在领域中协调较低级别的方法
SimpleOrder.Contracts
-用于表示和应用程序服务之间通信的DTO类
SimpleOrder.Domain(域/ bll)
-域模型类Customer,Order,OrderItem,Product
SimpleOrder.Repository(dal)
-实现存储库接口
这是我看到的选项:
选项1:在SimpleOrder.Contracts中定义存储库接口...
PRO:这是我认为它们应属于的位置,因为我创建了此对象,以在各个关注点/层次之间共享合同。例如,此处定义了DTO。
缺点:但是,每个接口中的方法签名都引用域模型类。
这意味着我将不得不添加对SimpleOrder.Domain的引用,但是当
SimpleOrder.Contracts在另一个项目中引用,它将必须携带
顺着SimpleOrder.Domain。这感觉不对。
选项2:与上述情况相同,但我也为每个域模型定义接口
SimpleOrder.Contracts中的class类,这样我就可以打破存储库接口与实际模型类之间的耦合。
例:
命名空间SimpleOrder.Domain.Interfaces
{
公共接口ICustomerRepository
{
ICustomer ** GetCustomerById(int customerId);
无效SaveCustomer(ICustomer客户);
}
公共接口ICustomer
{
int CustomerId {get;组; }
字符串名称{get;组; }
System.Collections.Generic.List订单{get; }
}
}
影响:每个域模型类都必须实现其相关接口。即
公共类Customer:SimpleOrder.Domain.Interfaces.ICustomer
{
公开客户()
{
_orders = new List();
}
public int CustomerId {get;组; }
公共字符串名称{get;组; }
私人名单订单;
公共虚拟列表订单{
得到{return _orders; }
}
}
PRO:解决了选项1的问题。
缺点:这会使项目中的文件数量激增(并引起复杂性),因为
每个域类现在都有一个关联的接口。
选项3:在SimpleOrder.Domain中定义存储库接口
影响:为了在运行时从SimpleOrder.ConsoleClient将具体的存储库类注入到应用程序服务层(SimpleOrder.ApplicationFacade项目)中,SimpleOder.ConsoleClient还将需要引用SimpleOrder.Domain。
PRO:这也解决了选项1
缺点:我试图避免直接从表示层引用域层,因为现在表示层可以对域层了解太多。将来当我将来用WPF或ASP.NET MVC应用程序替换控制台应用程序时,我会冒着第二次和以后的表示层实现尝试尝试在模型而不是应用程序服务层中调用方法的风险。 (但是我确实在选项4中考虑了这一点。)
选项4:将接口放在SimpleOrder.Domain中,然后从SimpleOrder.ConsoleClient引用SimpleOrder.Domain。
PRO:修复以上所有问题。
缺点:这感觉不对,因为我将提供来自表示层的访问权限
当我只应提供时,直接使用域层中的较低层方法
访问SimpleOrder.ApplicationFacade中的更高级别的块方法。
题
我已经尝试了所有这些方法,但是都选择了方法4,但是在我的口中却留下了不好的味道。有更好的选择吗?我在正确的轨道上吗?
最佳答案
根据您对问题的了解,我同意选项4是最好的。存储库接口应在所有域对象旁边的域层中声明。所述接口的实现应该是基础结构层(将您的域层连接到世界的层)的一部分。看一下Hexagonal Architecture可以看到一些动机。
为了解决选项4的弊端,您不应将控制台应用程序仅视为表示层。它还具有其他职责,例如,作为应用程序的宿主和DI的composition root。控制台应用程序可能有一个表示组件,该组件仅与应用程序服务通信。您还可以将应用程序服务封装在使用ASP.NET WebAPI实现的open host service后面。然后,表示层将仅引用此服务,并从基础域层中隐藏。
关于interface - 在哪里定义分层体系结构中存储库的接口(interface)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13846209/
在 Django 中如何处理分层 URL?有什么最佳做法吗?例如。如果我有一个像 /blog/category1/category2/myblogentry 这样的 URL(使用例如 django-m
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 要求我们推荐或查找工具、库或最喜欢的场外资源的问题对于 Stack Overflow 来说是偏离主题的,
有没有办法在 R 中创建这样的图表? 以下是图表中显示的数据的摘录: df % group_by(Animal) %>% unite(col=Type, Animal:Name, sep =
我一直在努力处理一些时间戳数据(直到现在才需要处理日期,并且它表明)。希望您能帮忙。 我正在处理来自网站的数据,该数据显示每个客户 (ID) 各自的访问以及这些访问的时间戳。它的分组是指一个客户可能有
我一直在努力处理一些时间戳数据(直到现在才需要处理日期,并且它表明)。希望您能帮忙。 我正在处理来自网站的数据,该数据显示每个客户 (ID) 各自的访问以及这些访问的时间戳。它的分组是指一个客户可能有
我正在尝试完成这段代码: ORDER BY IF(j.groups IS NULL OR j.groups = '', IF(j.title IS NULL, i.title), j.groups)
我有一个非常抽象的问题,因为我不确定如何提出它。我的其中一个 View 上有一个 UIImageView。我想让 ImageView 看起来“压入 super View ”。我不确定技术术语是什么,但
我希望 100% 宽的包含图像的 div 位于我的页面下方。在这些 div 之上,我想要一个 1210 像素宽的 div,我可以在其中放置我的内容。 例子: http://mudchallenger.
我目前正在做一个类似于 http://www.beoplay.com/Products/BeoplayA9#under-the-hood 的元素使用 Javascript、HTML5 和 CSS3。我
我想像上面那样创建图像缩略图..为此,我在下面创建了 XML activity_main.xml
我想知道是否可以定义一个分层 MapReduce 作业?。换句话说,我想要一个 map-reduce 作业,在 mapper 阶段将调用不同的 MapReduce 作业。可能吗?您对如何操作有什么建议
程序设计: A 类,实现较低级别的数据处理 类 B-E,为 A 提供更高级别的接口(interface)以执行各种功能 F 类,它是根据用户输入与 B-E 交互的 UI 对象 在任何给定时间只能有一个
CTE 对我来说有点新,所以我希望有人可以帮助我编写的以下内容将采用类别表并从中构建层次结构以进行显示。我知道这种事情一直被问到,但我认为我的排序情况使它有点独特。 我希望有一些使用 Hierarch
我有关于 的问题群 在聚类分析(层次聚类)中。例如,这是 的完全链式的树状图。虹膜数据集 . 我使用后 > table(cutree(hc, 3), iris$Species) 这是输出 : se
数据 我有以下(简化的)数据集,我们称之为 df从现在开始: species rank value 1
Delphi 2009 中的分层窗口和系统菜单存在问题。也就是说,我们的分层窗口(没有边框)没有系统菜单。当我说系统菜单时,我指的是单击应用程序的图标、右键单击其标题栏或(在 Windows 7 中,
我正在制作一个 pototype HMTL5 Canvas 动画,该动画将导出到 Quicktime。 我有一个动态生成的背景,上面有动态屏蔽的元素。 我可以获取要制作的背景,并将其作为逐帧动画(pn
好吧,我有一个打印棋盘的类和另一个打印国际象棋的类 如何使用 LayeredPane 将它们合并在一起,如上面的示例图片所示?我一整天都在尝试,但似乎没有任何效果。我正在使用 JFrame 打印图片。
这是我的场景。我有两个类(class) ClassA 和 ClassB。 B类继承A类。 我在它们两个上使用@Component注释来使它们成为Spring bean。 @Component publ
这不是一道问题题,而是一道使用工具——leiningen——的题。 在一个主项目下创建分层的 lein 项目是否有优势,如果有,优势是什么? 如果我使用 lein new bene-cmp 创建一个项
我是一名优秀的程序员,十分优秀!