社交媒体动作的通用API

时间:2012-12-10 04:51:06

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

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

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

我一直试图为这个

找到一个优雅的实现

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

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

文章&评论实施ISocial

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

FacebookProvider& TwitterProvider实施IProvider

当前用户授权的网络随附

OAuthWebSecurity.GetAccountsFromUserName(User.Identity.Name)

如何实现执行ISocial

中定义的操作的GenericAPI(JSON)

分享() - 分享/推特文章/对用户墙的评论

评论() - 如果文章,为文章创建新评论,如果评论,发表对现有评论的回复

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

谢谢

1 个答案:

答案 0 :(得分:3)

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

<强>描述

  

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

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

在下面的示例中,SocialContext是用于为每个Provider执行泛型函数的对象。您只需通过调用SetProvider(IProvider 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);
    }
}

}