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
DDDasal
2024-12-29 18:32:10202semak imbas

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);
}

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!

Kenyataan:
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