gpt4 book ai didi

c# - 体系结构问题:干净的解决方案应该放在哪个类的哪个类中?

转载 作者:行者123 更新时间:2023-11-30 19:22:28 28 4
gpt4 key购买 nike

前言:

这是到目前为止我在这里留下的最长的帖子...但是在这种情况下,我认为这是必需的。

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

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

想象一个应用程序


接受客户端消息,将它们存储在数据库中,然后在以后将它们从MTA服务器中出队。
这是一个Web应用程序,具有一个ASP.NET接口来编写消息和附加附件。
还有一个Silverlight客户端,因此该Web应用程序公开了带有一个OperationContract(SaveMessage)的ClientServices WCF ServiceContract。
还有一个Windows客户端...与Silerlight合同具有相同的功能。


好。这足以证明我的无知。

上面将需要以下类:


信息
留言地址
MessageAddressType(带有From,To的枚举)
MessageAddressCollection
邮件附件
MessageAttachmentType
MessageAttachmentCollection
MessageException
MessageAddressFormatException
MessageExtensions(Message的静态扩展名)
MessageAddressExtensions(MessageAddress的静态扩展名)
MessageAttachmentExtensions(MessageAttachment的静态扩展名)


Project.Contract.dll

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

Project.Client.dll

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

因此,现在也引用Project.Contract.dll的服务器现在可以保存从WCF客户端收到的序列化消息,并将其保存到db中。

外挂程式

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

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

因此,我想考虑回过头来从IMessageReadOnly继承Message ...但是将该接口放在哪里?

Project.Interfaces.dll

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

复制物件

或者,我可以有两个Messages结构(并也复制其他MessageAttachment等类)...一个用于从客户端到服务器进行通信(在Contracts.dll中),然后使用第二个ServerMessage / ServerMessageAddress / ServerMessageAddressCollection服务器端,它继承自IMessageReadOnly,然后看来我离我想要的东西更近了。
使用重复的对象,插件的访问受到限制,而Server BL等具有与其工作相关的类型的完全访问权限,而客户端拥有不同但相同的对象。
实际上...他们可能应该开始将它们视为不完全相同,这使我脑海中更加清楚,这些对象正与客户对话(即Contract / Comm对象)。

网站界面

如果出现两个不同的消息,并且它们现在具有不同的属性,则会弹出……嗡嗡声……最适合用来支持ASP.NET表单的属性是哪一个? ServerMessage对象似乎最快(类型之间没有映射关系)...但是所有逻辑已经针对客户端消息对象(具有不同的属性和内部逻辑)进行了计算。因此,我是否会使用ClientMessage并将其映射到Servermessage,以在不同媒介之间保持各种UI逻辑相同?还是我更喜欢映射,而只是重写UI验证?

第三种情况,Silverlight ... Contracts程序集是一个Full Framework程序集... Silverlight无法引用(不同的框架/构建机制)....所以我在Silverlight端拥有的程序集可能是完全相同的代码,但必须是不同的程序集。如何解决?

到底应该考虑什么作为DataContract?

最后...这是我发誓,在我巨大的问题即将结束时...关于那些显然不是DataContract的令人讨厌的额外类呢?

例如,MessageAddress是一个DataContract。好。它公开的枚举是它的一部分...很有道理...但是,如果messageAddress构造函数引发了MessageAddressFormatException ...是否将其视为DataContract的一部分?

服务器,客户端和AND插件都可以有共同的类吗?

还是这是ServerMessageAddress和ClientMessageAddress都共有的例外,因此不应重复,而应放在Common程序集中……以便最终,客户必须绑定到Contracts AND Common? (难道我们不只是通过Interfaces组件走这条小巷吗?)

普通的基类/接口呢?

这些异常是否应该具有通用的基类?例如... ClientMessageAddressException,ServerMessageAddressException,ServerMessageVirusException(来自插件)...我应该努力使它们尽可能(最好)全部从抽象MessageException派生...还是有一段时间进行继承/重用只是不再要争取一个适当的目标?

非常感谢您阅读本书。

我是一名开发人员,在技术方面,我可以继续前进...但是这些问题,我不得不在其中布置组件,体系结构,我自己,让我非常困惑...让我迷惑我花了很多时间,当我开车兜风时,将东西从一个装配移动到另一个装配,以查看哪一个是最合适的,同时还不确定我在做什么,并且试图不获取循环引用...

所以-真的-感谢您的聆听,我希望能被那些能够描述如何清晰地布置上述内容的人读到,希望也能表达出对未来项目的思考方式。

最佳答案

在花了10分钟编辑格式化问题之后,我仍然会否决它。我无法阅读所有内容。

去拿一份


Framework Design Guidelines: Conventions, Idioms, and Patterns for Reusable .NET Libraries (2nd Edition)

关于c# - 体系结构问题:干净的解决方案应该放在哪个类的哪个类中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1147343/

28 4 0