前言:
这是迄今为止我在这里留下的最长的帖子...但我认为这是在这种情况下需要。
我已经对这些各种各样的事情了很久的问题:如何命名组件,以及如何在其中划分等级。
我想在这里举一个应用的例子,只有最低限度的类来证明什么,我试图理解。
想象一下,一个应用程序,
- 接受客户端的邮件,将它们存储在一个数据库,再后来他们离队到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太多的时间,因为我自己开车疯狂,从一个组件绕搬东西到另一个,看看哪一个是最适合的,而一切不是真的一定的我在做什么,并努力没有得到循环引用...
所以 - 真的 - 谢谢你听,我希望这得到由人谁可以描述如何干净地铺陈之上,希望表达怎么想我的方式,通过它为未来的项目,以及阅读。