如何降低Facade实现的复杂性?

时间:2013-11-13 14:06:16

标签: c# architecture facade

正如您在下图中所看到的,我正在研究一种适用于我的研究小组需求的架构设计概念。这些是:

  • 可重用的业务逻辑组件
  • 解耦数据模型
  • 分离的前端(即网络UI,服务,控制台应用等)
  • 所有组件(前端除外)应完全可单元测试(使用例如模拟)。

为了实现这一目标,我们引入了一个“胶水”组件(Glue.ConsoleApp),它基本上是一个Facade模式实现。每个前端都有相应的立面。这是一个简单的C#解决方案,它显示了分离组件的非常小的实现。

Overview

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;
}

我担心我错误地将这种“清洁分离”误认为最终会让我比我想要的更多担忧。我可以想象门面快速增长非常大,难以维护。你有减少这种复杂性的建议吗?

旁注:我看过看起来很有趣的域事件模式,但我不确定如何将它应用于这种情况。

1 个答案:

答案 0 :(得分:0)

我在您的架构中看到的问题是3个不同的实体文件夹。对我而言,实体是与业务/域相关的概念,它们应仅在业务层中定义。相反,我倾向于调用服务和表示层 DTO 之间共享的对象。它们可以是商业实体的精确反映,也可以是更局部或更精细的内容。对于数据访问层,如果使用对象关系映射器,它将允许您透明地保持业务层中的实体,您不需要声明实体的DAL版本。您在DAL中可以拥有的是以您的实体命名的 DAO Repositories ,但它们不是实体,而是操纵它们。

这并不会删除所有映射,但我担心在分层架构中会有一些映射has to be done

作为旁注,我不明白为什么你应该为每个字体结尾都有一个Facade项目。这意味着很多代码重复。通常,应用程序具有某种服务层,可用作所有表示层的业务操作的单一Facade。