在本文中,我们将深入探讨 Unity 中条件依赖解析的概念,解决基于提供代码示例。
有条件解析
条件解析使您能够根据特定条件构造对象。在我们的例子中,我们希望 Unity 根据用户的身份验证方法选择适当的身份验证提供程序(Twitter 或 Facebook)。
接口
为了实现此目的,我们定义具有AppliesTo方法的IAuthenticate接口,该方法跟踪特定的身份验证方法所支持的方法
public interface IAuthenticate{ bool Login(string user, string pass); bool AppliesTo(string providerName); }
Authenticate Providers
对于每个身份验证提供程序(Twitter 和 Facebook),我们实现 IAuthenticate 接口并重写 AppliesTo 方法来指定它是否处理指定的认证
public class TwitterAuth : IAuthenticate { ... bool AppliesTo(string providerName) { // Check if this class name matches the provider name } }
策略
我们创建一个 IAuthenticateStrategy 接口,作为执行身份验证的中心点。该策略包括一个根据providerName选择适当的提供程序的方法。
public interface IAuthenticateStrategy{ bool Login(string providerName, string user, string pass); }
Unity注册
在我们的Unity配置中,我们注册身份验证提供程序和战略
unityContainer.RegisterType<IAuthenticate, TwitterAuth>("twitterAuth"); unityContainer.RegisterType<IAuthenticate, FacebookAuth>("facebookAuth"); unityContainer.RegisterType<IAuthenticateStrategy, AuthenticateStrategy>( // Resolve authentication providers array new InjectionConstructor(new ResolvedArrayParameter<IAuthenticate>( new ResolvedParameter<IAuthenticate>("twitterAuth"), new ResolvedParameter<IAuthenticate>("facebookAuth") )) );
使用
身份验证控制器现已修改为使用策略接口。
private readonly IAuthenticateStrategy _authenticateStrategy; public AuthenticateController(IAuthenticateStrategy authenticateStrategy) {...} public virtual ActionResult Twitter(string user, string pass) {...} public virtual ActionResult Facebook(string user, string pass) {...}
现在,当登录时使用特定提供程序名称调用操作,该策略将选择正确的身份验证提供程序并执行登录
改进的设计
策略模式将身份验证处理与控制器逻辑分开。只需添加新的身份验证提供程序而无需修改控制器代码,就可以更轻松地进行维护和扩展。
以上是Unity 的依赖注入如何处理基于提供者选择的条件身份验证?的详细内容。更多信息请关注PHP中文网其他相关文章!