架构问题:为了获得干净的解决方案,我应该将哪个类放在哪个程序集中?

2023-12-26

前言:

这是迄今为止我在这里留下的最长的帖子......但我认为在这种情况下这是必需的。

很长一段时间以来,我一直对这类事情有疑问:如何命名程序集,以及如何在其中划分类。

我想在这里给出一个应用程序的示例,仅用最少的类来演示我想要理解的内容。

想象一个应用程序

  • 接受客户端消息,将它们存储在数据库中,然后将它们出列到 MTA 服务器。
  • 它是一个 Web 应用程序,具有用于编写消息和附加附件的 ASP.NET 接口。
  • 还有一个 Silverlight 客户端,因此 Web 应用程序公开一个 ClientServices WCF ServiceContract,以及一个 OperationContract (SaveMessage)。
  • 还有一个 Windows 客户端...与 Silerlight 合约执行相同的操作。

好的。这应该足以证明我的无知是一个假场景。

上面将需要以下类:

  • Message

  • 留言地址

  • MessageAddressType(带有 From、To 的枚举)

  • 消息地址集合

  • 留言附件

  • 消息附件类型

  • 留言附件集合

  • 消息异常

  • 消息地址格式异常

  • MessageExtensions(消息的静态扩展)

  • MessageAddressExtensions(MessageAddress 的静态扩展)

  • MessageAttachmentExtensions(MessageAttachment 的静态扩展)

项目.合同.dll

我将上述内容组织到正确的程序集中的第一个尝试是观察 Message、MessageAddress、MessageAttachment、其属性所需的枚举(MessageAddressType、MessageAttachmentType)以及它们所需的集合(MessageAddressCollection、MessageAttachmentCollection)都将标记为[DataContract] 使它们可以在WCF客户端和服务器之间序列化。 由于两者都是共同的,我想我会将它们移动到一个名为 Contract 的中立共享程序集中。

项目.Client.dll

我需要服务器 [ServiceContract] 的客户端代理,它引用 Contract.dll 中的类。

因此,现在服务器(也引用 Project.Contract.dll)现在可以保存从 WCF 客户端接收到的序列化消息,并将它们保存到数据库中。

Plugins

接下来我会意识到我希望由第 3 方插件(例如病毒检查器)在服务器端处理这些对象...

但是插件应该对变量具有只读访问权限(仅),以便检查变量,并在看到不喜欢的内容时抛出错误。

所以我会考虑回去让 Message 继承自 IMessage Read Only ...但是该接口放在哪里呢?

项目接口.dll

如果我将它放在一个名为 Project.Interfaces.dll 的程序集中,这将适用于可以引用该程序集而无需引用 Contracts.dll 的插件...但现在客户端必须同时引用 Contracts 程序集和接口...听起来不是一个好方向...

重复对象

或者,我可以有两个 Messages 结构(并复制其他 MessageAttachment 等类)...一个用于从客户端到服务器的通信(在 Contracts.dll 中),然后使用第二个 ServerMessage/ServerMessageAddress/ServerMessageAddressCollection服务器端,继承自IMessageReadOnly,然后看起来我更接近我想要的了。 对于重复的对象,插件的访问受到限制,而服务器 BL 等对其工作相关的类型具有完全访问权限,而客户端具有不同但相同的对象...... 事实上......我可能应该开始将它们视为不相同,让我的头脑更清楚这些对象只是在那里与客户交谈,即合同/通信对象)...

网站用户界面

这会产生...嗯...如果有两个不同的消息,并且它们现在具有不同的属性...哪一个最适合用于支持 ASP.NET 表单? ServerMessage 对象似乎最快(类型之间没有映射)...但是所有逻辑都已经针对客户端消息对象(具有不同的属性和内部逻辑)制定出来。那么我是否会使用 ClientMessage 并将其映射到 Servermessage,以在不同的媒介上保持各种 UI 逻辑相同?或者我应该更喜欢映射,并重写 UI 验证?

第三种情况呢,Silverlight...合同程序集是一个完整的框架程序集...Silverlight 无法引用(不同的框架/构建机制)...所以我在 Silverlight 端的程序集可能是完全相同的代码,但必须是不同的程序集。结果怎么样?

到底要考虑什么作为数据契约?

最后...我发誓,这就是我的大问题即将结束的地方...那些不明确是 DataContract 的讨厌的额外类怎么办?

例如,MessageAddress 是一个 DataContract。好的。它公开的枚举是其中的一部分...有意义...但是如果 messageAddress 构造函数引发 MessageAddressFormatException...它是否被视为 DataContract 的一部分?

服务器、客户端和插件是否可以有共同的类?

或者它是 ServerMessageAddress 和 ClientMessageAddress 共同的异常,因此不应重复,而应该在 Common 程序集中......这样最终客户端必须绑定到 Contracts 和 Common? (我们不是刚刚和接口组件一起沿着这条小巷走下去的吗?)

常见的基类/接口怎么样?

这些异常应该有共同的基类吗?例如...ClientMessageAddressException、ServerMessageAddressException、ServerMessageVirusException(来自插件)...我是否应该努力让它们尽可能地全部源自抽象 MessageException...或者是否存在继承/重用的时候只是不再是一个合适的奋斗目标?

非常感谢您阅读本文。

我是一名开发人员,在技术方面我可以笨手笨脚地走下去……但是这些类型的问题,我必须自己布置组件、架构,让我非常困惑……并且迷失了我花了很多时间,我把自己逼疯了,将东西从一个组件移动到另一个组件,看看哪一个最适合,同时不确定我在做什么,并试图不得到循环引用......

所以,真的,感谢您的聆听,我希望能够描述如何清晰地阐述上述内容的人能够阅读本文,并希望能够表达出我对未来项目的思考方式。


在花了 10 分钟编辑问题格式后,我仍然会否决它。没有way我要读完所有这些。

去拿一份


Framework Design Guidelines: Conventions, Idioms, and Patterns for Reusable .NET Libraries (2nd Edition) https://rads.stackoverflow.com/amzn/click/com/0321545613

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

架构问题:为了获得干净的解决方案,我应该将哪个类放在哪个程序集中? 的相关文章

  • 如何使用.NET Core(FtpWebRequest)通过squid代理通过FTP获取文件?

    根据https learn microsoft com en us dotnet api system net ftpwebrequest proxy view netcore 3 1 https learn microsoft com e
  • C中函数指针的递归声明

    我想声明一个返回指向相同类型函数的指针的函数 我想用它来实现如下状态机 typedef event handler t event handler t event t compilation error event handler t st
  • 如何将不记名令牌发送到 ASP NET MVC 5 中的视图?

    我有一个 NET MVC and WEB API项目 我想打电话给WEB API controllers来自 javascript 但我没有找到将令牌发送到我的视图的方法 我想添加bearer token in Viewbag变量 使用以下
  • 如何通知父线程所有子线程都已终止?

    我有一个控制台应用程序正在移植到 WPF 该应用程序有 3 个工作线程 在将一些输出结果打印到屏幕上之前 这些线程都连接到主线程 我的理解是 如果我尝试在 WPF 应用程序中执行相同的操作 GUI 将被阻止并且不会响应用户 那么如何通知父线
  • 在 C# 中轻松创建支持索引的属性

    在 C 中我发现索引属性 http msdn microsoft com en us library aa288464 VS 71 aspx非常有用 例如 var myObj new MyClass myObj 42 hello Conso
  • 可变数量的(常量)引用参数

    我试图从我的高级代码 使用 C 11 中消除原始指针 并且我找到了引用 尤其是const 在许多情况下 当没有所有权转移时 是一个很好的替代品 但如果有的话该怎么办variable我想通过 常量 引用传递的参数数量 你不能创建一个std v
  • 为什么这个 oracle 批量插入不起作用?

    我正在尝试将一些数据批量插入到 oracle 数据库中 我按照文档中的示例进行操作 this DataBaseAccess new OracleConnection connString var dataAdapter new Oracle
  • C# 并行与并行线程代码性能

    我一直在测试 System Threading Parallel 与线程的性能 我很惊讶地发现并行比线程花费更长的时间来完成任务 我确信这是由于我对并行的了解有限 我刚刚开始阅读 我想我会分享一些片段 如果有人可以向我指出并行代码比线程代码
  • NHibernate IQueryable 集合作为 root 的属性

    我有一个根对象 它有一个集合属性 例如 I have a Shelf object that has Books Now public class Shelf public ICollection
  • 通过用于 Symbol 条码扫描仪 DS4208 的 SNAPI.dll API 捕获图像

    我想通过 SNAPI API 从 Symbol 目前为 Zebra 条形码扫描仪 DS4208 型号 我们还使用 Zebra 的另一个但兼容的型号 捕获图像 条形码捕获 识别效果很好 但看起来像SnapiDLL SNAPI SnapShot
  • 修剪 UIImage 边框

    这是我想要修剪的图像的示例 我想去掉图像周围的边框 在本例中是顶部和底部的黑条 我在Github上找到了一个库 CKImageAdditions https github com cmkilger CKImageAdditions 但是它似
  • 如何在Azure功能中添加razor视图文件?

    我正在创建一个应用程序 它是 azure 函数项目 我想在该项目中使用 Razor 视图 我应该在 azure 函数中使用任何模板引擎吗 得益于一些方面的进步剃刀之光项目 https github com toddams RazorLigh
  • 如何从Web JavaScript应用程序获取桌面C#程序中的变量

    我遇到一个问题 有两个应用程序 一种是 C 中的桌面应用程序 另一种是 javascript 中的 Web 应用程序 运行桌面应用程序中的一些变量或信息需要传输到Web应用程序 有谁知道如何解决这个问题 有人愿意提供更多细节来解决这个问题吗
  • 修改正在运行的可执行文件的资源内容

    All 我将应用程序设置存储在资源中 当我的程序首次加载时 我使用 WinAPI 读取指定的资源 然后我解析检索到的字节数据 这对我来说完美无缺 现在假设用户更改了我的应用程序中的设置 他 她检查复选框控件 我想将更新的设置保存到我的资源中
  • Identity Server 4:添加访问令牌的声明

    我正在使用 Identity Server 4 和隐式流 并且想要向访问令牌添加一些声明 新的声明或属性是 tenantId 和 langId 我已将 langId 添加为我的范围之一 如下所示 然后通过身份服务器请求 但我也获得了tena
  • 我可以在 C++ 中重写非虚函数吗

    我想知道我可以重写 C 中的非虚函数吗 因为我在使用 C 时发现了这个问题override关键字我的代码如下 class A public void say cout lt lt From A n class B public A publ
  • 将授权标头添加到 Web 参考

    我正在尝试向客户端的网络服务发出请求 我不知道客户端的底层平台 我使用 添加 Web 引用 在 Visual Studio 2010 中使用了客户端的 WSDL 并生成了我的代理类 称为 ContactService 我现在需要将如下所示的
  • 如何组合||条件语句中的运算符[重复]

    这个问题在这里已经有答案了 代替 if foo 1 foo 5 foo 9 我喜欢将它们组合起来 类似于以下内容 这不起作用 if foo 1 5 9 那可能吗 不幸的是不是 你最好的选择是创建一个扩展方法 public static bo
  • 用于 nmap 输出的 C++ xml 解析器

    我是 nmap 的新手 我在 nmap 教程中看到 https nmap org book man output html https nmap org book man output html oX 选项可用于获取 xml 格式的 nma
  • 是否可以编写一个在另一个 Windows 应用程序中选择文本时收到通知的 Windows 应用程序?

    我很好奇是否可以编写一个程序来监视我的文本选择 一种可能的用途是编写一个与编辑器 IDE 无关的代码格式化程序 应用程序 服务 P 启动并以某种方式挂接到窗口中 以便在任何窗口中选择文本时收到通知 启动其他一些应用程序 A 用户选择 A 中

随机推荐