领域驱动设计中的 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 序列化和值对象模式 的相关文章

  • PHP:__toString() 和 json_encode() 不能很好地协同工作

    我遇到了一个奇怪的问题 我不知道如何解决它 我有几个类 它们都是 JSON 对象的 PHP 实现 这是问题的说明 class A protected a public function construct this gt a array n
  • DDD:持久聚合

    让我们考虑一下典型的Order and 订单项目例子 假如说订单项目是的一部分Order聚合 只能通过订单添加 所以 要添加一个新的订单项目 to an Order 我们必须通过存储库加载整个聚合 将新项目添加到Order对象并再次保留整个
  • 手动将 ClientBase 集合类型从 Array[] 更改为 List<>

    我将自己的 WCF 代理与 Client Base 一起使用 我想做一些类似于 svc util 中的 ct 属性的操作 并告诉代理返回 List 集合类型 我不能使用 List 因为实体由 nhibernate 管理 所以我必须使用 IL
  • 将 javascript 变量发送到服务器端 ASP .NET

    我需要在回发时将 JavaScript 数据传递到服务器端 Exvar jsVariableToPass new Object jsVariableToPass key1 value1 jsVariableToPass key2 value
  • WCF 客户端因服务中断而挂起

    我有一个相当简单的 WCF 服务 它为一堆智能客户端执行单向文件同步 我注意到 当通话期间出现网络或服务中断时 客户端将无法与服务器通信 直到整个应用程序重新启动 该服务运行于BasicHttpBinding并由 IIS6 一个 svc 页
  • 将 fetch 与 Content-Type 结合使用时出现 CORS 错误 [重复]

    这个问题在这里已经有答案了 我正在尝试从 FireFox 中的不同域向 REST Web 服务发送 POST 请求 我为此使用 JavaScript 获取 函数 我在 IIS 中托管 REST Web 服务 在我在 JavaScript 中
  • WCF - 如何增加消息大小配额

    我有一个 WCF 服务 它将 1000 条记录从数据库返回给客户端 我有一个 ASP NET WCF 客户端 我在 asp net Web 应用程序项目中添加了服务引用来使用 WCF 当我运行客户端应用程序时 我收到以下消息 传入消息的最大
  • 我希望能够使用 lambda 表达式来指定要通过 wcf 服务返回的值范围

    我不知道这是否可能 但这会很酷 问题是这是否可能 但如果可能的话 举一个例子 我不确定您将使用什么方法签名来将 lambda 表达式传递到其中 例如方法IList
  • 在 WCF 上重用我的 PagedList 对象

    问题 我有一个自定义集合PagedList
  • 测试项目和配置文件

    我的 Visual Studio 2008 解决方案中有这种设置 一个使用库 Lib1 需要 app config 文件中的一些配置条目 的 WCF 服务项目 WCFService 我有一个单元测试项目 MSTest 其中包含与 Lib1
  • 如何防止在 CXF Web 服务客户端中生成 JAXBElement

    我正在尝试使用 CXF 创建一个 Web 服务客户端来使用 WCF Web 服务 当我使用 wsdl2java 时 它生成具有 JAXBElement 类型而不是 String 的对象 我读到有关使用 jaxb bindings xml 文
  • 无法从 Windows 7 上的 Windows 服务启动桌面应用程序

    HI 我在 Windows 7 上有 C WCF Windows 服务 以具有管理员权限的用户身份登录 我正在尝试在服务启动后启动桌面应用程序 我发现的所有讨论都是关于 Windows 工作站和桌面 我创建了一个单独的线程 设置线程工作站和
  • 自定义 WCF DataContractSerializer

    是否可以用我自己的序列化程序替换 Windows Communication Foundation 中的 dataContractSerializer 如果可能的话 我怎样才能实现这一目标 是的 您可以提供自己的序列化器实现 默认情况下 W
  • 我们为什么使用序列化?

    为什么我们需要使用序列化 如果我们想通过网络发送一个对象或一段数据 我们可以使用字节流 如果我们想将一些数据保存到磁盘上 我们可以再次使用二进制模式和字节流来保存它 那么使用序列化有什么好处呢 从技术上讲 在低级别上 您的序列化对象也将最终
  • 存储 PHP 数组的首选方法(json_encode 与序列化)

    我需要将多维关联数据数组存储在平面文件中以进行缓存 我偶尔可能会遇到需要将其转换为 JSON 以便在我的 Web 应用程序中使用的情况 但绝大多数时候我会直接在 PHP 中使用该数组 在此文本文件中将数组存储为 JSON 或 PHP 序列化
  • 类更改(例如字段添加或删除)是否保持 Serialized 的向后兼容性?

    我有一个关于 Java 序列化的问题 在这种情况下 您可能需要修改可序列化类并保持向后兼容性 我有丰富的 C 经验 所以请允许我将 Java 与 NET 进行比较 在我的Java场景中 我需要使用Java的运行时序列化机制序列化一个对象 并
  • 更改 JSON.NET 序列化属性名称的方式

    如何更改 Newtonsoft JSON NET 序列化对象属性名称的方式 有几种方法 You can manually control how it serializes using the JsonTextWriter class ht
  • WCF 服务主机配置 - 请尝试将 HTTP 端口更改为 8732

    我的 PC 上运行着一个复杂的基于 WCF 服务的解决方案 但由于安装 Windows 8 1 时出现问题 我不得不 刷新 我的 PC 现在我已经重新安装了 Visual Studio 2012 我的项目不再正常运行 当我调试单元测试时 w
  • 单元测试序列化有什么要点吗?

    我有一个类 它序列化一组我想要进行单元测试的对象 使用 XML 序列化 我的问题是 感觉我将测试 XML 序列化的 NET 实现 而不是任何有用的东西 我还有一个先有鸡还是先有蛋的场景 为了测试 Reader 我需要一个由 Writer 生
  • 通信对象 System.ServiceModel.Channels.ServiceChannel 不能用于通信

    通信对象System ServiceModel Channels ServiceChannel 无法用于通信 因为它处于故障状态 这个错误到底是什么意思 我该如何解决它 您收到此错误是因为您让服务器端发生 NET 异常 并且您没有捕获并处理

随机推荐

  • 对 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 的设置器 另外 为了