是否有一种模式或更简洁的方法来保存具有多个嵌套类的大对象?

时间:2018-05-25 02:45:24

标签: c# .net design-patterns

我正处于一个相当大的项目中,它涉及分解一个非常古老的大型ColdFusion遗留应用程序并在其中创建一些.NET服务。因此,有一些要求,我不是一个巨大的粉丝,它需要支持,因为我们转换到这个新的后端。其中一个要求是单个端点,必须使用具有数百个可选字段的非常大的JSON有效负载,并将其全部保存在一起。

我已将这些数据分解为一个相当大的域对象和各种嵌套的子类,如果它包含在请求中,则将每个子类保存在事务中。

代码看起来像这样:

    using (var transaction = await _transactionFactory.CreateDbTransactionScopeAsync(token))
    {

        //save basic patient info 
        newPatient = await _patientRepo.CreatePatientAsync(request, transaction, token);

        //save patient medicare information
        if (request.PatientMedicare != null)
            newPatient.PatientMedicare = await _patientRepo.CreatePatientMedicareAsync(newPatient.Id, request.PatientMedicare, transaction, token);

        //save patient flags
        if (request.PatientFlags != null)
            newPatient.PatientFlags = await CreatePatientFlagsAsync(newPatient.Id, request.PatientFlags, transaction, token);

        //save patient code
        if (request.PatientCode != null)
            newPatient.PatientCode = await _patientRepo.CreatePatientCodeAsync(newPatient.Id, request.PatientCode, transaction, token);

        //save patient facilities
        if (request.PatientFacilities != null)
            newPatient.PatientFacilities = await CreatePatientFacilitiesAsync(newPatient.Id, request.PatientFacilities, transaction, token);

       ... etc (this goes on for 15+ subclasses)

如果我可以避免必须这样做,我会,但直到我们能够重写更多的ColdFusion和前端代码,这才是真正唯一的选择。

是否有某种图案或某种东西可以使它更清洁?像构建器或工厂模式,但处理保存而不是创建对象?

这将是我与其他域对象处理的一个常见问题,更简洁的方法来处理这个问题会非常棒。

1 个答案:

答案 0 :(得分:1)

我不确定您需要支持的用例,但是一种方法是只保存JSON并从那里开始工作。

特别是对于PostgreSQL JSON类型,这可以很好地工作,但即使只是将它存储在文本字段中,在某些用例和负载下也是一个可行的选择。它也会释放你的双手,这样你就可以快速进入下一步。