3

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

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

我一直试图为此想出一个优雅的实现

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

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

文章和评论实施 ISocial

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

FacebookProvider 和 TwitterProvider 实现 IProvider

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

OAuthWebSecurity.GetAccountsFromUserName(User.Identity.Name)

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

IE

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

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

需要对提议的结构提出实施建议和/或批判性分析

谢谢

4

1 回答 1

3

作为管理“提供者”的说明;如果您的提供者能够做同样的事情,但是有不同的实现,您可以采用策略模式

描述

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

在您的情况下,不同的“算法”是每个提供商的逻辑(例如,在 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);
    }
}

}

于 2012-12-10T09:01:44.817 回答