依赖注入统一性-条件解析

依赖注入统一性-条件解析,第1张

依赖注入统一性-条件解析

解决此问题的一种简单方法是使用策略模式。请注意,您可以添加或删除登录提供程序而无需更改设计-
您只需要更改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);}


欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/zaji/5462602.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-12
下一篇 2022-12-11

发表评论

登录后才能评论

评论列表(0条)

保存