Rumah > pembangunan bahagian belakang > C++ > Bagaimanakah Suntikan Ketergantungan Perpaduan boleh digunakan untuk menyelesaikan secara bersyarat mekanisme pengesahan yang berbeza berdasarkan jenis pembekal?

Bagaimanakah Suntikan Ketergantungan Perpaduan boleh digunakan untuk menyelesaikan secara bersyarat mekanisme pengesahan yang berbeza berdasarkan jenis pembekal?

DDD
Lepaskan: 2024-12-29 18:32:10
asal
178 orang telah melayarinya

How can Unity Dependency Injection be used to conditionally resolve different authentication mechanisms based on provider type?

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);
}
Salin selepas log masuk

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); }
}
Salin selepas log masuk

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);
    }
}
Salin selepas log masuk

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")
        )
    ));
Salin selepas log masuk

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 */
}
Salin selepas log masuk

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" />
Salin selepas log masuk

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!

sumber:php.cn
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan