ASP.NET CoreのDependency Injection 〜 【その2】色んなDIの方法 〜

◆ Live配信スケジュール ◆
サイオステクノロジーでは、Microsoft MVPの武井による「わかりみの深いシリーズ」など、定期的なLive配信を行っています。
⇒ 詳細スケジュールはこちらから
⇒ 見逃してしまった方はYoutubeチャンネルをご覧ください
【5/21開催】Azure OpenAI ServiceによるRAG実装ガイドを公開しました
生成AIを活用したユースケースで最も一番熱いと言われているRAGの実装ガイドを公開しました。そのガイドの紹介をおこなうイベントです!!
https://tech-lab.connpass.com/event/315703/

こんにちは、サイオステクノロジー技術部 武井です。前回に引き続き、今回はいろんなDIの方法を書きます。

その1

以前ご紹介した方法は、以下のようにジェネリックの第1引数にインターフェース、第2引数にその実装クラスを指定しました。

AddSingleton<[インターフェースの型],[インターフェースの実装クラスの型]>();

以下のような書き方も可能みたいです。

AddSingleton<[クラスの型]>();

上記のクラスは、別に何らかのインターフェースを実装している必要はなく、普通のクラスでOKです。この場合、[クラスの型]をnewしたインスタンスがDIコンテナに登録され、スコープはSingletonになります。この書き方を実践したソースコードのサンプルは以下のとおりです。

public class Startup
{   
    public void ConfigureServices(IServiceCollection services)
    {   
        // これはHelloWorldクラスのインスタンスをDIする記述です。
        services.AddSingleton<HelloWorld>();
        services.AddMvc();
    }
    
    public void Configure(IApplicationBuilder app, IHostingEnvironment env)
    {   
        if (env.IsDevelopment())
        {   
            app.UseDeveloperExceptionPage();
        }
        
        app.UseMvc(routes =>
        {   
            routes.MapRoute(
                name: "default",
                template: "{controller=Home}/{action=Index}/{id?}");
        });
    }
}

public class HelloWorld
{
    public string Greet()
    {
        return "こんにちは世界";
    }
}

public class HomeController : Controller {

    private HelloWorld _helloWorld;

    // HelloWorldクラスをコンストラクタインジェクションしています。
    // 「その1」ではインターフェースを定義していましたが、
    // 今回はAddSingletonメソッドでクラスしか定義してないので、
    // クラスを指定しています。当然このhelloWorldにはHelloWorldクラスを
    // newしたインスタンスが入っています。
    public HomeController(HelloWorld helloWorld) {
        this._helloWorld = helloWorld;
    }

    public IActionResult Index()
    {
        this.ViewBag.Greet = this._helloWorld.Greet();
        return View();
    }
}

ビュー(index.cshtml)は以下のとおりです。

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8" />
    <title></title>
</head>
<body>
    @this.ViewBag.Greet
</body>
</html>

実行結果は以下の通りとなります。

こんにちは世界

さくっと何かのクラスのインスタンスをDIしたいときにこういう記述が役に立つのだと思います。

その2

その1の記述は以下のように記載することも出来ます。

AddSingleton(Func<IServiceProvider, TService> implementationFactory)

先程の「こんにちは世界」のソースコードにて、HelloWorldをDIする部分を上記の書き方で実現するためには、以下のようになります。

services.AddSingleton(sp =>
{
    return new HelloWorld();
});

もっと省略した書き方は以下のようになります。

services.AddSingleton(_ => new HelloWorld());
アバター画像
About 武井 宜行 269 Articles
Microsoft MVP for Azure🌟「最新の技術を楽しくわかりやすく」をモットーにブログtech-lab.sios.jp)で情報を発信🎤得意分野はAzureによるクラウドネイティブな開発(Javaなど)💻「世界一わかりみの深いクラウドネイティブ on Azure」の動画を配信中📹 https://t.co/OMaJYb3pRN
ご覧いただきありがとうございます! この投稿はお役に立ちましたか?

役に立った 役に立たなかった

3人がこの投稿は役に立ったと言っています。


ご覧いただきありがとうございます。
ブログの最新情報はSNSでも発信しております。
ぜひTwitterのフォロー&Facebookページにいいねをお願い致します!



>> 雑誌等の執筆依頼を受付しております。
   ご希望の方はお気軽にお問い合わせください!

Be the first to comment

Leave a Reply

Your email address will not be published.


*


質問はこちら 閉じる