正如您在下图中看到的那样,我正在研究一种架构设计的概念证明,它将满足我的研究小组的需求。这些都是:
- 可重用的业务逻辑组件
- 解耦数据模型
- 分离的前端(即 Web ui、服务、控制台应用程序等)
- 所有组件(前端除外)都应该是完全可单元测试的(例如使用模拟)。
为了实现这一点,我们引入了一个“胶水”组件(Glue.ConsoleApp),它基本上是一个外观模式实现。每个前端都会有一个对应的门面。这是一个简单的 C# 解决方案,它显示了分离组件的最小实现。
外观将所有组件链接在一起,但我认为代码仍然太复杂。我正在努力解决这样一个事实,即为了完全分离所有层,它们都需要定义自己的实体来使用,而粘合层必须进行大量映射(这就是我使用 ValueInjecter 的原因,一个库使大部分工作自动化)。
下面是一个示例方法,它显示了在一个方法中使用三个不同的类都代表一个 InvoiceLine 的复杂性:
using Database = ArchitecturePoC.DataAccess.Database;
using InvoiceProcessing = ArchitecturePoC.BusinessLogic.InvoiceProcessing;
public static Dictionary<Entities.Invoice, List<Entities.InvoiceLine>> GetAllInvoicesWithInvoiceLines()
{
Dictionary<Entities.Invoice, List<Entities.InvoiceLine>> result = new Dictionary<Entities.Invoice, List<Entities.InvoiceLine>>();
Database.InvoiceMapper invoiceMapper = new Database.InvoiceMapper();
Dictionary<Database.Entities.Invoice, List<Database.Entities.InvoiceLine>> invoicesWithInvoiceLines = invoiceMapper.GetAllInvoicesWithInvoiceLines();
foreach (KeyValuePair<Database.Entities.Invoice, List<Database.Entities.InvoiceLine>> invoiceWithInvoiceLines in invoicesWithInvoiceLines)
{
List<Entities.InvoiceLine> subResult = new List<Entities.InvoiceLine>();
foreach (Database.Entities.InvoiceLine invoiceLine in invoiceWithInvoiceLines.Value)
{
Entities.InvoiceLine resultInvoiceLine = new Entities.InvoiceLine();
resultInvoiceLine.InjectFrom(invoiceLine);
subResult.Add(resultInvoiceLine);
}
Entities.Invoice resultInvoice = new Entities.Invoice();
resultInvoice.InjectFrom(invoiceWithInvoiceLines.Key);
result.Add(resultInvoice, subResult);
}
return result;
}
我担心我把这种“干净的分离”误认为最终会给我带来比我想要的更多的担忧。我可以想象立面很快变得非常大并且难以维护。你有减少这种复杂性的建议吗?
旁注:我查看了看起来很有趣的域事件模式,但我不确定如何将其应用于这种情况。