c# - 关于将 POCO 从一层转换为另一层 POCO 的设计问题

标签 c# architecture

我在 WCF 服务应用程序中有一层业务级对象和一层契约(Contract)级对象。我所指的业务层对象只是我用来保存数据的实体或 POCO 对象。我指的契约(Contract)级对象是构成我的客户看到的 WSDL 的对象(也是 POCO)。

当我将数据从我的 WCF 服务返回到客户端时,请求参数从我的一个或多个契约(Contract)层对象合成为 XML 并继续转发。

我正在尝试创建一个位于契约(Contract)和业务层之外的类,它将对象从一层转换到另一层。因此,例如,在契约(Contract)层我会有一个类:

public class Person
{
    public string Name { get; set;};
}

我也可以在业务层中有一个相同的类(或者它可以不同),其属性将映射到此类中的属性。

然后我有一个类执行如下所示的代码:

public Contract.Person TranslatePerson(Business.Person person)
{
    Contract.Person result = new Contract.Person();
    result.Name = person.Name;
    return result;
}

这一切都按预期工作。但是,此翻译器服务的要求之一是将业务层与契约(Contract)层的​​更改隔离开来,并且该层的要求之一是允许不同版本的契约(Contract)层同时存在以支持 SOAP 客户端的向后兼容性.例如,如果在服务的 v2 中,我想将姓氏添加到人员类并将名称更改为名字,以便我的 SOAP 客户端现在可以看到两个数据点,我将有如下内容:

// remains for backwards compatibility for V1 clients
namespace Contract.V1
{
    public class Person
    {
        public string Name { get; set;};
    }
}

namespace Contract.V2
{
    public class Person
    {
        public string FirstName { get; set;};
        public string LastName { get; set;};
    }
}

现在,当我需要将 V2 Person 发送回客户端时,我想将 FirstName 从业务对象映射到 FirstName,并将 LastName 映射到 LastName。但是,如果我需要发回 V1 人,我会将 FirstName 映射到 Name 并删除 LastName。

因此,我为翻译层创建的架构是:

public class V1Translator
{
    public virtual Contract.V1.Person TranslatePerson(Business.Person person)
    {
        Contract.V1.Person result = new Contract.V1.Person();
        result.Name = person.Name;
        return result;
    }
}

public class V2Translator : V1Translator
{
    public override Contract.V2.Person TranslatePerson(Business.Person person)
    {
        Contract.V2.Person result = new Contract.V2.Person();
        result.Name = person.Name;
        return result;
    }
}

这为我节省了很多时间,因为我在 V1Translator 中可能有 100 种不同的翻译方法,但在 V2Translator 中我可能只需要覆盖 2 或 3 种,因为在不同层中可能只有少数对象发生变化。我还使用工厂实例化了适当的 Translator 类。通过这种方式,我可以在我的特殊 TranslationService 类上调用 TranslatePerson 并让它确定要使用哪个 Translator。然而,这也是问题所在。我无法重写基类中的方法,因为返回类型不同。尽管它们都是 Contract Person 对象,但它们位于不同的命名空间中。我很难通过这个。

有人可以帮我创建一个优雅的解决方案来解决这个问题吗?

谢谢

最佳答案

查看 AutoMapper ,它可以很好地减少您在这种情况下需要编写的手动映射代码量。

关于c# - 关于将 POCO 从一层转换为另一层 POCO 的设计问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3251193/

相关文章:

c# - 什么时候不要使用 'this' 关键字?

c# - 在 Async/Await 中调试异常(调用堆栈)

php - 我的 PHP 架构可靠吗?

c# - WPF 当子级的宽度绑定(bind)到父级的实际宽度时会发生什么

c# - NotSupportedException 对 Average 使用已编译的 lambda 表达式时

architecture - 有哪些技术可以在保持松散耦合的同时增加内聚力?

android - 清洁架构 : ViewModel with multiple UseCases on Android

java - 我应该总是从数据库中检索完整的对象吗?

c# - 用 Xunit 比较两个列表

android - Google Git 的 Android 源代码存储库的结构是什么?