我正在创建一个需要与多个社交网络平台集成的MVC4网站。内置于框架中的新OAuthWebSecurity类解决了身份验证和授权问题。
我的模型具有文章和评论类型的对象。这两个对象都是“社交的”,即可以共享,发布喜欢等等
我一直试图为这个
找到一个优雅的实现目前我已经定义了以下类和接口
ISocial - 定义“社交”类型应实现的最小方法
文章&评论实施ISocial
IProvider - 为社交媒体提供商定义属性和方法,例如AppId,AppSecret和所需的端点
FacebookProvider& TwitterProvider实施IProvider
当前用户授权的网络随附
OAuthWebSecurity.GetAccountsFromUserName(User.Identity.Name)
如何实现执行ISocial
中定义的操作的GenericAPI(JSON)即
分享() - 分享/推特文章/对用户墙的评论
评论() - 如果文章,为文章创建新评论,如果评论,发表对现有评论的回复
需要针对拟议结构的实施建议和/或关键分析
谢谢
答案 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);
}
}
}