gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 18:44:10 27 4
gpt4 key购买 nike

我在 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/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com