-->

建筑问题:在什么组件我应该把哪个类,一个干净的解决方案吗?(Architectural questi

2019-07-30 10:06发布

前言:

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

我已经对这些各种各样的事情了很久的问题:如何命名组件,以及如何在其中划分等级。

我想在这里举一个应用的例子,只有最低限度的类来证明什么,我试图理解。

想象一下,一个应用程序,

  • 接受客户端的邮件,将它们存储在一个数据库,再后来他们离队到MTA服务器。
  • 它同时具有一个ASP.NET的界面编写消息+附加附件的Web应用程序。
  • 还有一个Silverlight客户端,所以Web应用程序暴露了ClientServices WCF的ServiceContract,有一个OperationContract的(SaveMessage)。
  • 还有一个Windows客户端...做同样的事情作为Silerlight合同。

好。 这应该是够假的场景来展示我稀里糊涂的。

以上需要以下类:

  • 信息
  • MessageAddress
  • MessageAddressType(由枚举,为)
  • MessageAddressCollection

  • MessageAttachment

  • MessageAttachmentType
  • MessageAttachmentCollection

  • MessageException

  • MessageAddressFormatException

  • MessageExtensions(静态扩展消息)

  • MessageAddressExtensions(静态扩展MessageAddress)
  • MessageAttachmentExtensions(静态扩展MessageAttachment)

Project.Contract.dll

我在上面组织到正确的组件首次尝试将观察到的消息,MessageAddress,MessageAttachment,需要它的属性(MessageAddressType,MessageAttachmentType),需要对他们(MessageAddressCollection,MessageAttachmentCollection)集合的枚举,都被标记为[DataContract],使得它们可以在WCF客户端和服务器之间进行序列化。 作为常见的两种,我想我会它们移动到一个中立的共享组件,叫做合同。

Project.Client.dll

我需要在服务器[的ServiceContract]的客户端代理,该裁判在Contract.dll类。

所以,现在的服务器,其中还参Project.Contract.dll现在可以节省从WCF客户端接收的串行化的消息,并把它们保存到数据库中。

插件

下面,我想知道,我想有这些对象通过第三方插件来处理服务器端(例如,病毒检查)...

但是,插件应该以检查变量,如果他们看到的东西,他们不喜欢抛出错误只读权限(只)的变量。

所以,我觉得要回去有消息从IMessageReadOnly继承......但如果把那个界面?

Project.Interfaces.dll

如果我把它叫做Project.Interfaces.dll组件,这将工作谁能够引用,而不必Contracts.dll参考插件......但现在的客户端必须装配和接口同时引用合同...听起来不像是一个很好的方向......

重复的对象

可替换地,我可以有两个消息结构(以及重复的其他MessageAttachment等类和)...一个用于从客户端传送到服务器(在Contracts.dll),然后在使用第二SERVERMESSAGE / ServerMessageAddress / ServerMessageAddressCollection在服务器端,从IMessageReadOnly继承,然后它会出现,我更接近我想要的东西。 随着重复的对象,插件在访问限制,而服务器BL等具有与其工作相关的类型完全访问,而所有的客户都有不同,但相同的对象......其实......他们也许我应该开始考虑他们如不相同,使得它在我的头上的对象仅仅有更清晰的说话给客户,即合同/通讯对象)...

网站UI

这带来了......呜呜......如果有两个不同的消息,他们有现在不同了性能......哪一个是最适合使用于背ASP.NET表单? 该SERVERMESSAGE对象似乎最快的(没有映射回事类型之间)......但所有的逻辑已经制定了针对客户端消息对象(具有不同的特性和内部逻辑)。 所以我会用一个ClientMessage,并将其映射到一个SERVERMESSAGE,以保持各种UI逻辑是相同的,在不同的媒介? 或者我应该喜欢映射,只是重写UI验证?

对第三种情况是什么,Silverlight的...该合约总成是一个完整的框架组件... ...这Silverlight可以不REF(不同的框架/建机制)....所以,我对Silverlight的侧装配可能完全相同的代码,但必须是不同的组件。 是如何运作的呢?

正是考虑到为DataContract?

最后......这是,我发誓,我的附近的巨大问题结束......怎么样讨厌的额外类是没有明确DataContract?

例如,MessageAddress是DataContract。 好。 它暴露了枚举是它的一部分...有道理......但如果messageAddress构造提出了MessageAddressFormatException ......是它认为DataContract的一部分?

哪有常见的两种服务器,客户端类和插件?

或者是一个异常是常见的两种ServerMessageAddress和ClientMessageAddress,所以不应重复,而是在一个公共集会......因此,在年底,客户端绑定到合同与共? (我们不是只走这条胡同与接口组件?)

什么公共基类/接口?

并应这些异常有共同的基类? 例如... ClientMessageAddressException,ServerMessageAddressException,ServerMessageVirusException(从插件)......我要奋斗,让他们 - 尽可能地 - 从抽象MessageException所有派生......还是有时间的时候enheritence / reusse只是不再合适的目标,争取?

巨大的感谢您阅读这一步。

我是一个开发和高科技方面,我可以沿着确定胡扯......但这些各种各样的问题,在这里我不得不铺陈组件,架构,我自己,离开了我巨大的困惑......而失去了我SOOOO太多的时间,因为我自己开车疯狂,从一个组件绕搬东西到另一个,看看哪一个是最适合的,而一切不是真的一定的我在做什么,并努力没有得到循环引用...

所以 - 真的 - 谢谢你听,我希望这得到由人谁可以描述如何干净地铺陈之上,希望表达怎么想我的方式,通过它为未来的项目,以及阅读。

Answer 1:

花10分钟编辑格式化的问题后,我仍然要downvote它。 有没有办法,我会阅读所有。

去接副本


框架设计指南:公约,成语和可重复使用.NET库模式(第2版)



Answer 2:

作为一个建筑师,我才知道,那不值得过于着迷把事情绝对完美的第一次,和完善是主观的。 重构,尤其是组件之间移动类,并没有过于庞大成本。 这听起来好像你已经通过思考的东西在逻辑上和正确。 这是我对一些您的问题意见

问:我是不是应该只读我的数据合同类合同?

该插件最有可能不应该知道你的数据的合同都没有。 如果你正在做的插件的通用接口层病毒检查程序可能需要一个字节数组,拼写检查的字符串和语言环境,等等,你应该只是孤立分享的内容具体到插件中的数据。 这将使您能够充分利用他们的重用。 因此,我认为你会得到关于创建接口将数据结构的合同,这应该主要是很少的逻辑数据的哑袋子实际上是接口本身有点回报。

问:我应该使用相同的数据合同类作为我的Silverlight应用程序并在我的ASP.NET应用程序或直接使用服务器端类?

我将与客户端消息的对象去这样你就可以从代码重用中受益。 对象的创建是相当便宜的,我敢肯定,大多数的映射是一对一的。 它没有那么快,真的,但不会是在应用程序中的瓶颈。

问:我在哪里把我的异常类?

我会把你的榜样异常类与数据合同大会,因为他们都提出因违反合同或同时履行合同进行沟通错误的手段。

问:如果该异常有共同的基类?

我还没有需要做到这一点,但我不知道你的代码库,以及你做的。 我的猜测是,它会得到什么,如果你不大。

编辑:

你可能会超量计划未来。 根据我的经验,采取了YAGNI的方法,使我们能够得到更迅速地完成重要的事情。 进行增量设计变更最好花费宝贵的时间建立一个复杂的架构,你可能从来没有从中受益。



文章来源: Architectural question: In what assembly should I put which class, for a clean solution?