请检查我的设计 - 需要输入

时间:2010-08-05 14:47:24

标签: c# design-patterns architecture

2 个答案:

答案 0 :(得分:1)

我同意Jaroslav - 我希望通过IApiService接口访问各种实例属性。

(好吧,我的C#生锈了 - 在C ++中我通过在IApiService接口上调用set / getProfilePhoto方法来访问IPhoto接口。)

接下来,您的所有示例都涉及Facebook特定的类,而我希望它们是用通用接口(IPhoto,IApiSession等)编写的。

如果没有这些抽象,你就没有可插拔的解决方案,这似乎是要求。

答案 1 :(得分:0)

关于你的界面IApiService,对Seb Rose和Jaroslav所说的内容进行了扩展。

使用界面的好处是:如果您的工厂给我(客户端代码)IApiService,我不需要知道哪个 IApiService我为了使用它。

但是,在您的模型中,IApiService没有检索照片的方法。如果我想要一张照片,我必须找出它真正的IApiService(Facebook),并访问FacebookAlbumPhotoFacebookProfilePhoto。因为客户端正在与FacebookPhotoService而不是IApiService的方法进行交互,所以它会破坏界面的目的。

这并不是说它很容易修复。如果您想真正充分利用界面,则必须设计IApiService的方法和属性,这些方法和属性可用于您计划的所有照片服务。也许你选择通过像IEnumerable<IPhoto> GetAllPhotos()这样的方法来拍照,而牺牲了个人资料和专辑照片之间的(特定于Facebook)区别......(你总是可以检查得到的IPhoto个看看他们是FacebookAlbumPhoto,但你想避免这种情况,直到有必要......)

或者你可能认为有一个方法IPhoto GetProfilePhoto()是有价值的,但是你意识到某些服务可能没有个人资料照片,所以他们会返回null(或者集合中的第一张照片,或者对于特定服务似乎正确的任何东西)。也许您添加IEnumerable<string> GetTags()IEnumerable<IPhoto> GetPhotosByTag(string Tag),如果您的某个服务使用的是“类别”而不是“标记”,则可以隐藏这种区别。

您已经提供了很多关于您的架构的详细信息,但是需要有关项目目标的更多信息才能真正帮助权衡这些选项。

(另外请注意,你必须做出选择并且面向未来永远不会100%。如果这将是未来12个月的Facebook,你现在可以将其写为特定于Facebook并在以后重构一个优点是,从现在起一年后,您将比现在更了解您的应用程序及其不断发展的需求。嘿,也许您需要集成的下一个大型照片服务今天甚至不在线!)< / p>