Asp.NetCore依存注入

2770 ワード

ASP.NET Coreは、依存注入をサポートし、使用するように設計されています.ASP.NET Coreアプリケーションは、Startupクラスのメソッドでアプリケーションに注入され、アプリケーションサービスでも注入を構成できる組み込みフレームワークサービスを使用することができます.ASP.NET Coreが生成したデフォルトのサービスコンテナは、他のコンテナに取って代わるものではなく、最小の機能セットを提供します.依存注入(Dependency injection,DI)は、オブジェクトとその協力者または依存項目との間のばらばらな結合を実現する技術である.

自分のサービスを登録します


自分のアプリケーションサービスを以下のように登録することができます.最初の汎用タイプは、コンテナから要求されるタイプ(通常はインタフェース)を表します.2番目の汎用タイプは、コンテナによってインスタンス化され、これらの要求を完了するために使用される特定のタイプを表す.services.AddTransient(); services.AddTransient();

サービスのライフサイクルと登録オプション


ASP.NETサービスは、Transient:過渡的ライフサイクルは、サービスが必要とするたびに作成されます.軽量級、無状態のサービスに最適です.Scoped:役割ドメインは現在の役割ドメイン内にあり、何度呼び出されてもインスタンスであり、役割ドメインを変更すると、特定の役割内の単一のインスタンスと同様にインスタンスが再作成されます.Singleton:単一のインスタンスを作成し、呼び出すたびに単一のオブジェクトを返します.1インタフェースの定義
  public interface ICharacterRepository
    {
        IEnumerable ListAll();
        void Add(User character);
        string CeshiMethod();
    }

2実装クラスの定義
 public class CharacterRepository : ICharacterRepository
    {
        private readonly ApplicationDbContext _dbContext;

        public CharacterRepository(ApplicationDbContext dbContext)
        {
            _dbContext = dbContext;
        }

        public IEnumerable ListAll()
        {
            return _dbContext.users.AsEnumerable();
        }

        public void Add(User character)
        {
            _dbContext.users.Add(character);
            _dbContext.SaveChanges();
        }
        public string CeshiMethod()
        {
            return "This is ceshi";
        }
    }

実装クラスのApplicationDbContextは、登録されたデータベースコンテキストであり、システム起動ファイルに登録されています。


:
 services.AddDbContext(options =>
               options.UseInMemoryDatabase());

3先ほど定義したICharacterRepositoryを依存注入として登録するか、システム起動ファイルにservices.AddScoped();を登録してコントローラで呼び出すか
  public class CharactersController : Controller
    {

        private readonly ICharacterRepository _characterRepository;

        public CharactersController(ICharacterRepository characterRepository)
        {
            _characterRepository = characterRepository;
        }

        // GET: /characters/
        public IActionResult Index()
        {
            var characters = _characterRepository.ListAll().ToList();

            return View(characters);
        }       
    }

コンストラクション関数でICharacterRepositoryを宣言し、依存注入によって実際のシステム実行でインスタンス化されるのがCharacterRepositoryクラスです.