1. ホーム
  2. Web プログラミング
  3. ASP.NET

ASP.NET Core Dependency Injectionフレームワークの活用

2022-01-14 21:34:04

まえがき

前回の記事を思い出してください ASP.NET Core Dependency Injectionの詳細について 最後に、増え続けるサービスにどう対処するかが述べられていましたが、今回はその解決策をお届けします。この記事は前回の記事の続きなので、考え方は前回の記事を参考にしてください。

I. IoCフレームワーク

まずは一般的なIocフレームワークから見ていきましょう。
Autofac. 現在 net より多く使用され、多くの兄のプロジェクトは、より好ましいフレームワークです。
Ninject. 今はもうほとんど使われていませんが、ごく初期の記事で見たことがあります。
Unity. 多くの場所で使用されている、より一般的なものは
Core: Core はCore /codeに付属しているので、ビジネスロジックがあまり複雑でない場合は、やはり便利です。

II. IoC-Autofac

Autofac NET ドメインで最も人気のある IOC フレームワークで、最も高速なものの1つであるという伝説があります。

長所

  • C#言語と非常に密接に連携しているため、C#の多くのプログラミングスタイルが Autofac を使用することができます。
  • は学習曲線が低く、一度理解すればとても簡単に習得できます。 IoC やDIの概念を、どのような時に使うのか。
  • XML.Json コンフィギュレーション対応。
  • 自動組立。
  • と同じです。 Asp.Net MVC を統合する。
  • マイクロソフトの Orchad オープンソース・プログラムでは Autofac と、その便利さと威力をソースコードでご紹介しています。

ほとんどの人が話す Autofac は、ほとんどの記事で言及されており、フレームワークの優秀さを示しています。

NET CoreはDIの利用が前提

{NET Core. 1. まず {NET Core Web Api ASP.Net Core Web Api .NET 5.0のプロジェクトで、全体は以下のようになっており、赤字の部分がCoreのDIに付属している部分です。

2. クラスライブラリプロジェクトを新規に作成し、インターフェイスファイルとクラスファイルをそれぞれ追加します。

インターフェイスです。

    public interface ISayHelloService
    {
        string SayHello(string name);
    }




クラスがあります。

    public class EnglishSayHelloService : ISayHelloService
    {
        public string SayHello(string name)
        {
            return $"Hello,{name}! ";
        }
    }



3. で Startup の中にある ConfigureServices メソッドが注入されます。

 services.AddScoped<ISayHelloService, EnglishSayHelloService>();



4. そして、先ほど注入したサービスをコントローラで使用します。

    [Route("api/[controller]/[action]")]
    [ApiController]
    public class HelloController : ControllerBase
    {
        public readonly ISayHelloService sayHelloService;

        public HelloController(ISayHelloService sayHelloService)
        {
            this.sayHelloService = sayHelloService;
        }

        [HttpGet]
        public string CoreDI()
        {
            return sayHelloService.SayHello("CoreDI");
        }

    }


注意 ルーティングアクセスアドレス、404エラーがある場合、それはルーティングの問題かもしれません、ルートは、実際のニーズに応じて自分で[Route("api/[コントローラ]/[アクション]")]を修正することができます。

5. アクセステスト

ここで使用したインターフェーステストソフトウェアは Postman Apiテストは非常に便利で、オンラインで検索することができます、あなたがに私を見つけることができない場合は、私に連絡することができます。

四、オートファックの使用

1. 新しい ASP.Net Core Web Api .NET 5.0)プロジェクトと区別するために、以前のCore自己完結型のDIを作成しました。

2.引用引用 Autofac パッケージ、ダウンロード数を見てみると、やはり非常にワオ

3. で Program の中に Autofac 依存性注入を実装するために

    public class Program
    {
        public static void Main(string[] args)
        {
            CreateHostBuilder(args).Build().Run();
        }

        public static IHostBuilder CreateHostBuilder(string[] args) =>
            Host.CreateDefaultBuilder(args)
                .ConfigureWebHostDefaults(webBuilder =>
                {
                    webBuilder.UseStartup<Startup>();
                });
    }


4. Startup クラスに以下のメソッドを追加します。 ConfigureContainer で、以前のサービスをインジェクトします。

   public class Startup
    {
        public Startup(IConfiguration configuration)
        {
            Configuration = configuration;
        }

        public IConfiguration Configuration { get; }

        public void ConfigureServices(IServiceCollection services)
        {
            services.AddControllers();
        }
        // Injected here
        public void ConfigureContainer(ContainerBuilder builder)
        {
            builder.RegisterType<EnglishSayHelloService>().As<ISayHelloService>();
         
        }
     
        public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
        {
            if (env.IsDevelopment())
            {
                app.UseDeveloperExceptionPage();
            }

            app.UseRouting();

            app.UseAuthorization();

            app.UseEndpoints(endpoints =>
            {
                endpoints.MapControllers();
            });
        }
            
    }



5. コントローラは基本的にここで変更する必要はありません。

   [Route("api/[controller]/[action]")]
    [ApiController]
    public class HelloController : ControllerBase
    {
        public readonly ISayHelloService sayHelloService;

        public HelloController(ISayHelloService sayHelloService)
        {
            this.sayHelloService = sayHelloService;
        }

        [HttpGet]
        public string CoreDI()
        {
            return sayHelloService.SayHello("AutofacDI");
        }

    }


6. プロジェクトを実行し、Postmanとのインターフェースのテストを続けます。

について Autofac は、やはりかなりシンプルですね。

V. バルクインジェクション

簡単なサービスを数個書くだけならまだしも、数十個、数百個となると、考えるのも怖いくらいです。そこで、オートファックの利点が発揮されるのがバルクインジェクションです。

1. サービスにインターフェイス、クラスをそれぞれ追加する。

インターフェイスを使用します。

   public interface IUseAutofacService
   {
       string UseAutofac(string name);
   }



クラスがあります。

   public class UseAutofacService : IUseAutofacService
   {
       public string UseAutofac(string name)
       {
           return $"{name} batch injection test! ";
       }
   }



2. 前回のStartupクラスに戻り、メソッドを修正します。 ConfigureContainer .

       public void ConfigureContainer(ContainerBuilder builder)
       {
           //builder.RegisterType<EnglishSayHelloService>().As<ISayHelloService>();

           // Service project assembly
           Assembly service = Assembly.Load("Autofac.Service");
          
           //Service interface project assembly
           Assembly iservice = Assembly.Load("Autofac.Service");

           builder.RegisterAssemblyTypes(service, iservice).Where(n => n.FullName.EndsWith("Service") && !n.IsAbstract)
               .InstancePerLifetimeScope().AsImplementedInterfaces();

       }


注意 注入されるサービスに IXXXService インターフェイスを使用する場合 builder.RegisterAssemblyTypes の場合、アセンブリを1つだけ渡す必要があります。もしサービスがインターフェースと同じプロジェクトにある場合は、2つのアセンブリを渡す必要もあります。

3. 次に、先ほど作成したコントローラを少し変更します。

   [Route("api/[controller]/[action]")]
    [ApiController]
    public class HelloController : ControllerBase
    {
        public readonly ISayHelloService sayHelloService;

        public readonly IUseAutofacService useAutofacService;

        public HelloController(ISayHelloService _sayHelloServ