最近,我发现了自己的依赖注入和可靠的原则,所以现在我开始了我的项目,它经常使用社会服务,所以我想遵循这些原则来创建一个好的架构。
假设我有一个登录页面,用户可以在其中使用社交服务凭据登录,或者使用之前注册的登录和密码登录。根据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();
。
在这种情况下,我应该使用什么:抽象类或接口,以便遵循可靠的原则,并且在登录页面中只有Authenticatable
或IAuthenticatable
类型?我应该如何对待这里的第三方插件才能将它们应用到这个架构中?因为我不能改变他们的源代码。
谢谢。
发布于 2015-01-08 15:56:21
首先,您不会更改其他服务的实现。相反,您将提供适配器。每个适配器都将实现您的接口,但在内部将使用另一个实现。
然后,如果有任何不同,您可以引入一个对象参数:
void Login( LoginParameters parameters, ... )
然后就有
public class LoginPasswordParameters : LoginParameters ...
public class SmartCardParameters : LoginParameters ...
或者仅仅是让你的LoginParameters足够灵活
public class LoginParameters
{
public List<Tuple<string, string>> Parameters ...
这样,您就有了一个包含所有可能登录参数的键值对的类,而不是类层次结构。
当涉及到使用通用身份提供者进行日志记录这一特定活动时,您不必发明您自己的接口。这是因为大多数提供商实现了非常相同的OAuth2协议,并且已经有了抽象和实现都已经可用的实现解决方案。以DotnetOpenAuth库为例。
https://stackoverflow.com/questions/27843987
复制