解决此问题的一种简单方法是使用策略模式。请注意,您可以添加或删除登录提供程序而无需更改设计-
您只需要更改DI配置即可。
验证提供者public interface IAuthenticate{ bool Login(string user, string pass); bool AppliesTo(string providerName);}public interface IAuthenticateStrategy{ bool Login(string providerName, string user, string pass);}
战略public class TwitterAuth : IAuthenticate{ bool Login(string user, string pass) { //connect to twitter api } bool AppliesTo(string providerName) { // I used the type name for this example, but // note that you could use any string or other // datatype to select the correct provider. return this.GetType().Name.Equals(providerName); }}public class FacebookAuth: IAuthenticate{ bool Login(string user, string pass) { //connect to fb api } bool AppliesTo(string providerName) { return this.GetType().Name.Equals(providerName); }}
统一注册public class AuthenticateStrategy: IAuthenticateStrategy{ private readonly IAuthenticate[] authenticateProviders; public AuthenticateStrategy(IAuthenticate[] authenticateProviders) { if (authenticateProviders == null) throw new ArgumentNullException("authenticateProviders"); this.authenticateProviders = authenticateProviders; } public bool Login(string providerName, string user, string pass) { var provider = this.authenticateProviders .FirstOrDefault(x => x.AppliesTo(providerName)); if (provider == null) { throw new Exception("Login provider not registered"); } return provider.Login(user, pass); }}
用法// Note that the strings used here for instance names have nothing // to do with the strings used to select the instance in the strategy patternunityContainer.RegisterType<IAuthenticate, TwitterAuth>("twitterAuth");unityContainer.RegisterType<IAuthenticate, FacebookAuth>("facebookAuth");unityContainer.RegisterType<IAuthenticateStrategy, AuthenticateStrategy>( new InjectionConstructor( new ResolvedArrayParameter<IAuthenticate>( new ResolvedParameter<IAuthenticate>("twitterAuth") ), new ResolvedArrayParameter<IAuthenticate>( new ResolvedParameter<IAuthenticate>("facebookAuth") ) ));
private readonly IAuthenticateStrategy _authenticateStrategy;public AuthenticateController(IAuthenticateStrategy authenticateStrategy){ if (authenticateStrategy == null) throw new ArgumentNullException("authenticateStrategy"); _authenticateStrategy = authenticateStrategy;}// login with twitterpublic virtual ActionResult Twitter(string user, string pass){ bool success = _authenticateStrategy.Login("TwitterAuth", user, pass);}// login with fbpublic virtual ActionResult Facebook(string user, string pass){ bool success = _authenticateStrategy.Login("FacebookAuth", user, pass);}
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)