正如您在下图中所看到的,我正在研究一种适用于我的研究小组需求的架构设计概念。这些是:
为了实现这一目标,我们引入了一个“胶水”组件(Glue.ConsoleApp),它基本上是一个Facade模式实现。每个前端都有相应的立面。这是一个简单的C#解决方案,它显示了分离组件的非常小的实现。
Facade将所有组件链接在一起,但在我看来,代码仍然过于复杂。我正在努力解决这个问题,为了完全分离所有层,他们都需要定义自己的实体来处理,胶层必须做大量的映射(这就是为什么我使用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;
}
我担心我错误地将这种“清洁分离”误认为最终会让我比我想要的更多担忧。我可以想象门面快速增长非常大,难以维护。你有减少这种复杂性的建议吗?
旁注:我看过看起来很有趣的域事件模式,但我不确定如何将它应用于这种情况。
答案 0 :(得分:0)
我在您的架构中看到的问题是3个不同的实体文件夹。对我而言,实体是与业务/域相关的概念,它们应仅在业务层中定义。相反,我倾向于调用服务和表示层 DTO 之间共享的对象。它们可以是商业实体的精确反映,也可以是更局部或更精细的内容。对于数据访问层,如果使用对象关系映射器,它将允许您透明地保持业务层中的实体,您不需要声明实体的DAL版本。您在DAL中可以拥有的是以您的实体命名的 DAO 或 Repositories ,但它们不是实体,而是操纵它们。
这并不会删除所有映射,但我担心在分层架构中会有一些映射has to be done。
作为旁注,我不明白为什么你应该为每个字体结尾都有一个Facade项目。这意味着很多代码重复。通常,应用程序具有某种服务层,可用作所有表示层的业务操作的单一Facade。