Penyelesaian Bersyarat dalam Suntikan Ketergantungan Perpaduan
Penyelesaian bersyarat membenarkan bekas untuk menyelesaikan dan menyuntik pelaksanaan berbeza antara muka berdasarkan kriteria tertentu. Dalam kes ini, kami berhasrat untuk menggunakan Unity untuk menyelesaikan secara bersyarat mekanisme pengesahan yang berbeza berdasarkan jenis pengesahan yang digunakan (cth., Twitter, Facebook, dll.).
Antaramuka
Tentukan antara muka IAuthenticate untuk mewakili gelagat pengesahan. Tambahkan kaedah AppliesTo untuk menyemak sama ada pembekal menggunakan nama pembekal yang ditentukan.
public interface IAuthenticate { bool Login(string user, string pass); bool AppliesTo(string providerName); }
Pembekal Pengesahan
Buat kelas berasingan (cth., TwitterAuth dan FacebookAuth) yang melaksanakan IAuthenticate dan mengandungi logik pengesahan khusus. Dalam kaedah AppliesTo, tentukan sama ada pembekal berkenaan berdasarkan nama pembekal yang disediakan.
public class TwitterAuth : IAuthenticate { bool Login(string user, string pass) { /* Logic to connect to Twitter API */ } bool AppliesTo(string providerName) { return this.GetType().Name.Equals(providerName); } }
Strategi
Laksanakan antara muka IAuthenticateStrategy untuk merangkum logik resolusi bersyarat . Suntikan pelbagai penyedia IAuthenticate dan gunakan kaedah AppliesTo untuk memilih penyedia yang betul untuk pengesahan.
public interface IAuthenticateStrategy { bool Login(string providerName, string user, string pass); } public class AuthenticateStrategy : IAuthenticateStrategy { private readonly IAuthenticate[] _authenticateProviders; public AuthenticateStrategy(IAuthenticate[] authenticateProviders) => _authenticateProviders = authenticateProviders; public bool Login(string providerName, string user, string pass) { var provider = _authenticateProviders.FirstOrDefault(x => x.AppliesTo(providerName)); if (provider == null) { throw new Exception("Login provider not registered"); } return provider.Login(user, pass); } }
Pendaftaran Perpaduan
Daftar penyedia pengesahan dan strategi dengan Unity, menyatakan nama pembekal untuk bersyarat resolusi.
unityContainer.RegisterType<IAuthenticate, TwitterAuth>("twitterAuth"); unityContainer.RegisterType<IAuthenticate, FacebookAuth>("facebookAuth"); unityContainer.RegisterType<IAuthenticateStrategy, AuthenticateStrategy>( new InjectionConstructor( new ResolvedArrayParameter<IAuthenticate>( new ResolvedParameter<IAuthenticate>("twitterAuth"), new ResolvedParameter<IAuthenticate>("facebookAuth") ) ));
Penggunaan
Dalam pengawal, suntik IAuthenticateStrategy dan gunakannya untuk melaksanakan pengesahan bersyarat berdasarkan pembekal nama.
public AuthenticateController(IAuthenticateStrategy authenticateStrategy) { if (authenticateStrategy == null) throw new ArgumentNullException(nameof(authenticateStrategy)); _authenticateStrategy = authenticateStrategy; } public virtual ActionResult Twitter(string user, string pass) { bool success = _authenticateStrategy.Login("TwitterAuth", user, pass); /* Authenticate using Twitter */ } public virtual ActionResult Facebook(string user, string pass) { bool success = _authenticateStrategy.Login("FacebookAuth", user, pass); /* Authenticate using Facebook */ }
unity.config
Sebagai alternatif, anda boleh melakukan pendaftaran Unity dalam fail unity.config.
<register type="IAuthenticate" mapTo="TwitterAuth" name="twitterAuth" /> <register type="IAuthenticate" mapTo="FacebookAuth" name="facebookAuth" /> <register type="IAuthenticateStrategy" mapTo="AuthenticateStrategy" />
Atas ialah kandungan terperinci Bagaimanakah Suntikan Ketergantungan Perpaduan boleh digunakan untuk menyelesaikan secara bersyarat mekanisme pengesahan yang berbeza berdasarkan jenis pembekal?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!