Pertanyaan Cara menyuntikkan dependensi ke global.asax.cs


Bagaimana cara menyuntikkan dependensi ke global.asax.cs, yaitu kelas MvcApplication?

Setelah sebelumnya menggunakan pola Service Locator (anti-) untuk injeksi ketergantungan, saya mencoba mengikuti saran praktik terbaik dalam aplikasi MVC terbaru saya dengan menggunakan wadah IOC (khusus Unity.Mvc3 karena dilengkapi dengan penerapan IDependencyResolver dari kotak) dan injeksi konstruktor.

Semuanya tampak cukup lurus ke depan sejauh ini kecuali untuk beberapa halangan, salah satunya adalah di global.asax.cs (yang lain adalah untuk atribut khusus tetapi ada aleady pertanyaan tentang SO yang meliputi).

Penangan event HttpApplication dalam kelas MvcApplication seperti:

Application_Start()
Application_EndRequest(object sender, EventArgs e)
Application_AcquireRequestState(object sender, EventArgs e)

mungkin memerlukan ketergantungan eksternal, mis. ketergantungan pada ILogService. Jadi bagaimana cara menyuntikkannya tanpa menggunakan pola pelacak layanan (anti-) misalnya

private static ILogService LogService
{
    get
    {
        return DependencyResolver.Current.GetService<ILogService>();
    }
}

Bantuan / saran apa pun sangat dihargai!


32
2017-10-13 09:26


asal


Jawaban:


Kelas di global.asax.cs Anda adalah milik Anda Komposisi Root, jadi Anda tidak bisa (dan tidak boleh) menyuntikkan sesuatu ke dalamnya dari luar.

Namun, hanya ada satu contoh kelas MvcApplication, jadi jika Anda memerlukan layanan dalam salah satu metode, Anda dapat mendeklarasikannya sebagai bidang anggota - misalnya:

public class MvcApplication : System.Web.HttpApplication
{
    private readonly ILogService log;

    public MvcApplication()
    {
        this.log = new MyLogService();
    }

    protected void Application_Start()
    {
        // ...

        this.log.Log("Application started");
    }
}

33
2017-10-13 09:50