首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >首选内容:使用服务时的抽象类或接口(例如app42、facebook、google+等)和IoC

首选内容:使用服务时的抽象类或接口(例如app42、facebook、google+等)和IoC
EN

Stack Overflow用户
提问于 2015-01-08 23:43:55
回答 1查看 133关注 0票数 0

最近,我发现了自己的依赖注入和可靠的原则,所以现在我开始了我的项目,它经常使用社会服务,所以我想遵循这些原则来创建一个好的架构。

假设我有一个登录页面,用户可以在其中使用社交服务凭据登录,或者使用之前注册的登录和密码登录。根据DI的说法,我必须有一个“承诺”所需功能的抽象,但对我来说,问题是App42登录方法需要登录和密码,而其他一些服务(例如facebook)不需要,也可能不需要。我可能会为App42和facebook创建单独的界面,但情况并非如此,因为我将来想要使用的服务(例如推特)越多,我就会有更多的界面,登录页面中到它们的链接就会增长。

public interface ICredentialsAuthenticatable { void Login(string username, string password, Action<IUser> successCallback = null, Action<IServiceException> failCallback = null); void Logout(string sessionId, Action<IServiceResponse> successCallback = null, Action<IServiceException> failCallback = null); }

public interface IScopeAuthenticatable { void Login(string scope, Action callback = null); void Logout(); }

此外,不同的服务应该以不同的方式进行初始化: App42的App42API.BuildUserService();或facebook的FB.Init();

在这种情况下,我应该使用什么:抽象类或接口,以便遵循可靠的原则,并且在登录页面中只有AuthenticatableIAuthenticatable类型?我应该如何对待这里的第三方插件才能将它们应用到这个架构中?因为我不能改变他们的源代码。

谢谢。

EN

回答 1

Stack Overflow用户

发布于 2015-01-08 23:56:21

首先,您不会更改其他服务的实现。相反,您将提供适配器。每个适配器都将实现您的接口,但在内部将使用另一个实现。

然后,如果有任何不同,您可以引入一个对象参数:

代码语言:javascript
运行
复制
void Login( LoginParameters parameters, ... )

然后就有

代码语言:javascript
运行
复制
public class LoginPasswordParameters : LoginParameters ...

public class SmartCardParameters : LoginParameters ...

或者仅仅是让你的LoginParameters足够灵活

代码语言:javascript
运行
复制
public class LoginParameters
{
    public List<Tuple<string, string>> Parameters ...

这样,您就有了一个包含所有可能登录参数的键值对的类,而不是类层次结构。

当涉及到使用通用身份提供者进行日志记录这一特定活动时,您不必发明您自己的接口。这是因为大多数提供商实现了非常相同的OAuth2协议,并且已经有了抽象和实现都已经可用的实现解决方案。以DotnetOpenAuth库为例。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27843987

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档