领域驱动设计中的 WCF 序列化和值对象模式

2024-03-18

Eric Evans 所著的《领域驱动设计》一书描述了称为值对象的模式。值对象的重要特征之一是它是不可变的。

作为一个例子,我有一个值对象“Clinic”,其中must有名字和id。为了使其成为值对象,我不提供名称和 ID 的设置器。另外,为了确保不存在无效实例,我在构造函数中获取名称和 id,并且不提供无参数构造函数。

公开课诊所 {

public Clinic(string name, string id)
{
    Name = name;
    Id = id;  
}

public string Name{get; private set;}
public string Id{get; private set;}

}

问题是,当我尝试从 WCF 服务返回此对象时,我收到一个异常,该对象没有无参数构造函数,并且属性没有公共设置器。我想避免添加无参数构造函数和公共设置器,因为这样我的域模型模式就会出现问题。我该如何解决这个问题?

问候, 取消网格划分


我之前在序列化不可变类型时遇到了类似的问题,最后我决定实现 ISerialized 接口并使用 SerializationInfo 在序列化/反序列化过程的两端存储和检索私有变量:

http://theburningmonk.com/2010/04/net-tips-making-a-serialized-immutable-struct/ http://theburningmonk.com/2010/04/net-tips-making-a-serializable-immutable-struct/

我刚刚使用相同的技术构建并运行了一个测试应用程序,它似乎对我有用。因此,就您的诊所课程的更改而言,您可以将其更改为:

[Serializable]
public class Clinic : ISerializable
{
public Clinic(string name, string id)
{
    Name = name;
    Id = id;  
}

public Clinic(SerializationInfo info, StreamingContext context)
{
    Name= info.GetString("Name");
    Id= info.GetString("Id");
}

public string Name{get; private set;}
public string Id{get; private set;}

[SecurityPermission(SecurityAction.Demand, SerializationFormatter = true)]
public void GetObjectData(SerializationInfo info, StreamingContext context)
{
    info.AddValue("Name", Name);
    info.AddValue("Id", Id);
}
}

这将解决您从 WCF 传回数据的问题。但从设计的角度来看,我同意 Ladislav 的说法,通常您会希望将域对象与纯粹用于消息传递的对象(DataTransferObjects)分开,在这种情况下,这里是您可能如何处理它的示例:

// the domain object (NOT EXPOSED through the WCF service)
public class Clinic
{
public Clinic(string name, string id)
{
    Name = name;
    Id = id;  
}

public string Name{ get; private set;}
public string Id{ get; private set;}

// other methods encapsulating some business logic, etc.
...
}
// the corresponding DTO object for the domain object Clinic
// this is the type exposed through the WCF layer, that the client knows about
[DataContract]
public class ClinicDTO
{
    [DataMember]
    public string Name { get; set; }
    [DataMember]
    public string Id { get; set; }
}
// WCF service contract, NOTE it returns ClinicDTO instead of Clinic
[ServiceContract]
public interface IClinicService
{
   [OperationContract]
   ClinicDTO GetClinicById(string id);
}

为了减轻从 Clinic 转换为 ClinicDTO 的痛苦,您可以在 Clinic 上添加一个方法来执行此操作,或者实现一个隐式/显式转换器。我在这里有一个关于如何执行此操作的示例:http://theburningmonk.com/2010/02/controlling-type-conversion-in-c/ http://theburningmonk.com/2010/02/controlling-type-conversion-in-c/

希望这可以帮助!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

领域驱动设计中的 WCF 序列化和值对象模式 的相关文章

  • 通过 WCF 提供类对象的数组或列表

    任何提供自定义类对象列表或数组的 WCF 客户端服务器示例都会对我有所帮助 但这是我到目前为止所得到的 这是我想提供的班级系统 namespace NEN Server FS Serializable public class XFS pr
  • “无法连接到远程服务器”

    我可以从 Windows 窗体程序调用第三方供应商的 Web 服务 当我尝试从 WCF Web 服务调用相同的 Web 服务和 Web 方法以及相同的 URL 时 出现以下错误 ExportValuationPolicyNumber Exc
  • 在 .NET 中序列化,在 C++ 中反序列化

    我有一个 NET 应用程序 它以二进制格式序列化对象 该对象是一个由几个字段组成的结构 我必须在 C 应用程序中反序列化并使用该对象 我不知道是否有 C 的序列化库 谷歌搜索没有出现太多 实现这一目标最快的方法是什么 提前致谢 罗伊 更新
  • WCF 服务中无法解释的程序集负载 (IIS 7)

    我正在开发一个新的 WCF Web 服务 该服务将托管在现有的 ASP NET Web 应用程序中 当我尝试运行服务的 svc 文件时 出现异常 无法找到程序集的文件 无法加载文件或程序集 System IdentityModel Vers
  • C# 中的序列化和对象版本控制

    如果我想序列化一个对象 我必须使用 Serializable 属性和所有成员变量将被写入该文件 我不知道如何进行版本控制 例如如果我添加一个新的成员变量 重命名变量或仅删除变量 然后打开 反序列化 文件 如何确定对象 文件版本 以便我可以正
  • 如何使用 Jackson 将列表内容序列化为平面 JSON 对象?

    给定以下 POJO public class City private String title private List
  • djangorest框架:从序列化器validate()方法设置字段级错误

    我有一个序列化程序 它根据其他字段的值验证字段 在错误响应中 我想将每个字段错误显示为字段错误 而不是显示 non field errors 下的所有内容 如果我提出错误 就会发生这种情况对象级验证方法中的 ValidationError
  • GeoDjango:距离对象不可序列化

    我刚刚学习 geo django 我可以找出所有地方到一个点的距离 但是当我使用 values方法注释distance场 我得到 TypeError Object of type Distance is not JSON serializa
  • 实体框架和数据库集

    我正在尝试设置一个通用接口来从存储库中检索实体 问题是我需要从 WCF 服务请求数据 而据我所知 泛型不能与操作合约一起使用 所以我有这个在控制台应用程序中工作 而不是使用服务调用 public virtual List
  • BigDecimal 无法强制转换为 BigDecimal

    这应该很简单 但它却爆炸了 有任何想法吗 d BigDecimal new 2 0 YAML load a gt d to yaml TypeError BigDecimal can t be coerced into BigDecimal
  • 序列化代码导致未处理的异常

    我正在尝试创建一些代码 可以将类库序列化和反序列化为 AutoCAD 绘图 这个问题与 AutoCAD 没有什么关系 只是它是我无法通过正常方式调试它的原因 我从开始这个项目本文 http adndevblog typepad com au
  • C# xml序列化必填字段

    我需要将一些字段标记为需要写入 XML 文件 但没有成功 我有一个包含约 30 个属性的配置类 这就是为什么我不能像这样封装所有属性 public string SomeProp get return someProp set if som
  • 委托给子组件的模式

    在我正在工作的产品中 非常基本的场景之一是类的序列化 通常 要序列化的类会在其子组件上调用序列化 例如如果有一个类 s t 班级 A B C D 那么A Pack会调用pack B C D 上的函数 由于有很多这样的类 因此必须一遍又一遍地
  • WCF 服务引用从 WSDL 生成 void 方法

    这是我第一次尝试使用 WCF 所以我猜我做错了什么 我正在尝试访问 WSDL 定义的肥皂服务http confluence atlassian com rpc soap axis confluenceservice v1 wsdl http
  • 如何序列化/反序列化自定义数据集

    我有一个 winforms 应用程序 它使用强类型的自定义数据集来保存数据进行处理 它由数据库中的数据填充 我有一个用户控件 它接受任何自定义数据集并在数据网格中显示内容 这用于测试和调试 为了使控件可重用 我将自定义数据集视为普通的 Sy
  • 如何在自托管 WCF 中获取多部分表单数据?

    我已经搜索了很长一段时间 但没有找到我要找的东西 我在 Windows 应用程序中自行托管了一个 http WCF 现在 在我的服务方法之一中 我需要接收一个文件和一些表单数据字段 在类似的问题中 情况要么发送一个文件 这是通过流数据然后转
  • 使用非英语的通用语言? [关闭]

    Closed 这个问题是无关 help closed questions 目前不接受答案 在讨论最近项目的规范和功能要求时 我们正在与领域专家讨论荷兰语的会计术语 因为整个团队和客户都是以荷兰语为母语的人 当开发开始时 我们很自然地用英语实
  • ChannelFactory重用策略

    我一直在读到 ChannelFactory 的创建是昂贵的 除非有技术原因不这样做 否则应该在可能的情况下重用 ChannelFactory 或者通过某种方式缓存它们 或者使用工厂的静态实例 根据您的经验 您发现哪些 ChannelFact
  • 当在 Repository/UnitOrWork 之上使用 Service 类时,我应该在哪里放置逻辑不适合 Repository 的常用数据访问代码?

    In my 先前的问题 https stackoverflow com questions 24906548 using the generic repository unit of work pattern in large projec
  • java.io.Serialized 在 C/C++ 中的等价物是什么?

    C C 的等价物是什么java io Serialized https docs oracle com javase 7 docs api java io Serializable html 有对序列化库的引用 用 C 序列化数据结构 ht

随机推荐

  • 对 JS 和 CSS 的请求改为给出 index.html

    我在用着Express and create react app 我的 React 应用程序已经发展了很长一段时间 现在我正在尝试从 Express 服务器提供它 server app js const express require ex
  • Inno Setup:将 DLL 放入子目录中

    我想将依赖项 几个 DLL 文件 复制到单独的子目录中 安装我的程序后 目录结构将如下所示 dlls a dll b dll sample pg exe 我的脚本的相关部分如下 Dirs Name app sample Name app d
  • Django 可重用应用程序教程,ImportError:没有名为“polls”的模块

    我试图跟随 本教程 https docs djangoproject com en 1 8 intro reusable apps 重用民意调查应用程序 但是当我成功打包应用程序并安装包后 Unpacking home julia Docu
  • 循环遍历目录中的文件,在 pandas 中添加日期列

    我的所有文件都具有以下标题 并且它们可以追溯到几年前 我希望能够读取每个文件 然后将文件名中的日期添加为一列 截至 2015 04 01 csv 的文件类型 path C Users filelist os listdir path All
  • 将 CSV 文件导入 PostgreSQL 时忽略引号?

    我正在尝试将制表符分隔的文件导入到我的 PostgreSQL 数据库中 我的文件中的字段之一是 标题 字段 其中偶尔包含实际的引号 例如 我的 tsv 可能如下所示 id title 5 Hello Bleah Foo 是的 标题中只有一个
  • 是否可以在 Mac 上使用 GUI 并行工具查看 git diff?

    我真的很讨厌使用默认的 UNIX 来可视化差异diff工具 是否可以使用 GUI 工具查看 git diff 该工具可以很好地并排显示本地和远程 类似于如何设置mergetool to be DiffMerge当你这样做时 git merg
  • 电子邮件未通过 1and1 smtp 主机 nodemailer caddy 发送

    在我的 Nodejs Express 应用程序中 当新用户注册时 我使用 NodeMailer 发送电子邮件 这是我的电子邮件配置 位于我的 config json 中 senderEmail email senderEmailPasswo
  • 如何更正此 sql 连接上的相关名称?

    我需要一个连接 从两个不同的表中生成三个具有相同名称的字段 当我尝试运行 sql 查询时 VS 给出以下错误 FROM 子句中的对象 PoliticalFigures 和 PoliticalFigures 具有相同的公开名称 使用相关名称来
  • 为什么每个字符串上都有空字符串? [复制]

    这个问题在这里已经有答案了 例如 gt gt gt s python gt gt gt s index 0 gt gt gt s index p 0 这是因为从索引 0 开始的长度为 0 的子串 python 等于空字符串 gt gt gt
  • java regex:从字符串中获取可能变化的子字符串

    我有一个像这样的字符串 Bangalore India Karnataka 我只想从这个字符串中提取子字符串 Bangalore 在这种情况下 正则表达式可以是 但问题是 字符串有时可能只是 Bangalore 那么在这种情况下 上面的正则
  • 为什么 Xcode 在创建地址清理构建时定义 _LIBCPP_HAS_NO_ASAN?

    Xcode 7 允许使用地址清理器来查找 C C 中的内存问题 https github com google sanitizers wiki AddressSanitizer https github com google sanitiz
  • 如何在 Eclipse 中启用 TODO/FIXME/XXX 任务标签?

    在我使用 Eclipse 的这些年里 直到现在我才知道 TODO FIXME XXX 注释标签应该出现在任务列表中 显然 默认情况下这是禁用的 因为只要我使用 Eclipse 我就一直在使用这些标签 而且我从未见过其中一个出现在任务列表中
  • C 中的嵌入式 perl、perlapio - 与 STDIO 的互操作性

    我刚刚意识到 PerlIO 层似乎不仅仅 或多或少 轻松地包装 stdio h 函数 如果我尝试使用通过以下方式解析的文件描述符PerlIO stdout and PerlIO fileno 对于 stdio h 中的函数 这会失败 例如
  • AutoFixture 和私有财产

    我可以指导吗汽车夹具 https github com AutoFixture还可以填充私有属性 并用特定属性进行注释 例如Ninject Inject 所有类别中 来源似乎只扫描公共属性 1 https github com AutoFi
  • 动态数组 - 如何增加数组的大小?

    我正在从文件中读取数字 然后尝试将它们添加到数组中 我的问题是如何增加数组的大小 例如 我认为也许可以这样做 include
  • 通过 CLI 更新 AWS API Gateway 资源策略的语法是否正确?

    我正在尝试通过 CLI 更新 API 网关实例上的资源策略 但我似乎找不到正确的 JSON 语法 在文档中 它说使用 补丁操作 据我了解 它需要一串 JSON 来表示策略 我尝试过缩小 JSON 转义 JSON 单引号 无引号 但似乎都不起
  • 如何卸载附加场景?

    我正在制作一款坦克战游戏 每轮后都会随机生成新的关卡 在我的游戏管理器中 我试图让回合从随机范围索引中的附加加载场景开始 然后以卸载场景结束 然后加载到新的随机场景中 然而 我所做的每一次尝试都会导致某种形式的错误 我一直被引导到 Load
  • 我如何在 Heroku 上安排“每周”工作?

    我在 Heroku 上部署了一个 Rails 应用程序 并使用 Heroku 调度程序插件成功处理日常工作 现在我想要一个每周工作 但调度程序附加组件不允许我每周选择 关于我如何实现这一目标的任何建议 我过去曾尝试使用 rufus sche
  • 折线(路线)悬停时的工具提示

    我已经在地图上标出了路线 使用一些坐标生成的路线 其中包含附加信息 速度 我希望当路线悬停时 会出现一个工具提示并显示这些坐标处的信息 速度 我很困惑如何显示速度的工具提示
  • 领域驱动设计中的 WCF 序列化和值对象模式

    Eric Evans 所著的 领域驱动设计 一书描述了称为值对象的模式 值对象的重要特征之一是它是不可变的 作为一个例子 我有一个值对象 Clinic 其中must有名字和id 为了使其成为值对象 我不提供名称和 ID 的设置器 另外 为了