【问题标题】:Generic API for Social Media Actions社交媒体操作的通用 API
【发布时间】:2012-12-10 04:51:06
【问题描述】:

我正在创建一个需要与多个社交网络平台集成的 MVC4 网站。框架中内置的新 OAuthWebSecurity 类解决了身份验证和授权问题。

我的模型有文章和评论类型的对象。这两个对象都是“社交的”,即可以共享、发布喜欢等

我被困在试图为此找到一个优雅的实现

目前我已经定义了以下类和接口

ISocial - 定义“社交”类型应实现的最小方法

文章和评论实现 ISocial

IProvider - 定义社交媒体提供商的属性和方法,例如 AppId、AppSecret 和所需的端点

FacebookProvider 和 TwitterProvider 实现 IProvider

当前用户已授权的网络可用

OAuthWebSecurity.GetAccountsFromUserName(User.Identity.Name)

如何实现执行 ISocial 中定义的操作的 GenericAPI (JSON)

Share() - 分享/推文/评论到用户墙

Comment() - 如果是文章,则为文章创建新评论,如果是评论,则回复现有评论

需要对拟议结构的实施建议和/或关键分析

谢谢

【问题讨论】:

    标签: c# api design-patterns social-networking


    【解决方案1】:

    关于管理您的“提供者”的说明;如果您的提供商能够做同样的事情,但有不同的实现,您可以采用Strategy Pattern

    说明

    在计算机编程中,策略模式(也称为 策略模式)是一种特殊的软件设计模式,其中一个 算法的行为可以在运行时选择。正式地说, 策略模式定义了一系列算法,封装了每一个 一,并使它们可以互换。策略让算法变化 独立于使用它的客户。

    在您的情况下,不同的“算法”是每个提供商的逻辑(例如,在 Facebook 上添加评论的代码或在 Google+ 上发布新文章的代码)。

    在下面的示例中,SocialContext 是用于执行每个 Provider 的通用函数的对象。你只需要通过调用SetProvider(IProvider provider)来设置Provider

    您的 API 调用方法可以模仿 SocialContext 方法以及一些代码来决定在运行时使用哪个 Provider。

    这是你的例子:

    namespace StrategyPattern
    {
        class Program
        {
            static void Main(string[] args)
            {
                var context = new SocialContext();
    
            context.SetProvider(new FacebookProvider()); //switch which provider you want to use
    
            context.AddComment(new Comment()
                {
                    Message = "Heres my Comment!"
                });
        }
    }
    
    
    //providers
    
    public interface IProvider
    {
        void AddComment(Comment comment);
        void PostArticle(Article article);
    }
    
    public class FacebookProvider :IProvider
    {
        public void AddComment(Comment comment)
        {
            //facebook implementation of "AddComment"
        }
    
        public void PostArticle(Article article)
        {
            //facebook implementation of "PostArticle"
        }
    }
    
    public class TwitterProvider : IProvider
    {
        public void AddComment(Comment comment)
        {
            //twitter implementation of "AddComment"
        }
    
        public void PostArticle(Article article)
        {
            //twitter implementation of "PostArticle"
        }
    }
    
    
    public class Article
    {
        public string Content { get; set; }
    }
    
    public class Comment
    {
        public String Message { get; set; }
    }
    
    
    
    //context to use the providers
    
    public class SocialContext
    {
        private IProvider _provider;
    
        public void SetProvider(IProvider provider)
        {
            _provider = provider;
        }
    
        public IProvider GetProvide { get { return _provider; } }
    
        public void AddComment(Comment comment)
        {
            _provider.AddComment(comment);
        }
    
        public void PostArticle(Article article)
        {
            _provider.PostArticle(article);
        }
    }
    

    }

    【讨论】:

    • 感谢 Mike 的提醒 .. 无论如何,我都可以使用单一的 Post 方法来发表文章和评论 .. 我在考虑泛型,但我不确定我是否会因为新奇而过度复杂化我的代码
    • 实际上它不仅新颖,我希望能够将评论分享到用户墙上,API 调用将相同,内容将根据对象类型而有所不同,无论如何我可以避免使用 sharearticle 和 sharecomment 而只使用 share
    • 只有在 IProvider 上有一个 Share(Item item) 方法,这不会阻止你。您似乎想使用相同的方法对不同的对象执行不同的操作。考虑到这个问题 - 我会考虑审查您的设计。
    • 对当前设计缺陷的指针将受到高度重视。如果您能指出正确的方向,我会很乐意将此标记为答案,(并不是说我不认可您已经做出的努力).. 任何模式技巧?
    • 不幸的是,我正在尝试的并不是真正可行的,因为对不同实体执行操作的 API 调用不同,所以我相信我必须按照你的建议实现我的要求。由于我还没有所需的声誉,因此无法对您的回复进行投票。谢谢迈克。
    猜你喜欢
    • 2019-03-16
    • 2014-10-12
    • 2019-08-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-18
    • 1970-01-01
    相关资源
    最近更新 更多