コントロールの1反転(IOC)
コントロール(対照、のIoCの反転)の反転は、オブジェクト指向プログラミングの1つの設計原理は、タグ間の結合の程度を減少させます。
1.1依存関係反転
依存関係原理:
(1)高レベルモジュールは、抽象に依存すべき低レベルのモジュールに依存してはなりません。
(2)特定の抽象に依存すべきではない、それは特定の抽象化に依存しなければなりません。
1.2依存性注入
依存性注入:依存部分(または頻繁に制御可能な連結部を変更していないコード)は、抽象のメンバー(クラス、抽象クラスまたはインタフェース)、およびトランス制御達成するために、柔軟な注入に頼る必要な特定の例となりますそれによってデカップルコードを達成する、効果を転送します。
依存性の注入は、特定の実装を制御反転しています。
C#の一般的な依存性の注入:
(1)コンストラクタ依存性注入によって
プロパティアクセサを介して(2)依存性注入
インターフェースを介して(3)依存性注入
(4)反射することにより、注射の実装依存特性であってもよいです
2. ASP.NETコアは、依存性注入が付属しています
依存性の注入のインストールパッケージ:
インストール・パッケージMicrosoft.Extensions.DependencyInjection
ASP.NETコアは、内蔵サービスコンテナIServiceProvider、コンフィギュレーション依存Startup.ConfigureServices注入プロセスを提供します。
ASP.NETコアサービス寿命登録:
(1)AddTransient:一時的な生存は、たびにサービスコンテナからの要求を作成します。
(2)AddScoped:スコープ生存、一度作成された各クライアント要求(接続)。
(3)AddSingleton:寿命サービスの単一のインスタンスは、第1の要求、同じインスタンスを使用するすべての後続の要求を作成しました。
例:
パブリックインターフェイスILogRepository { int型インサート(ログログ)。 }
パブリッククラスLogRepository:ILogRepository { 公共のintを挿入(ログインログイン) { 使用して(VARコンテキスト=新しいPortalContext()) { context.Logs.Add(新しいログイン { ユーザー名= log.UserName、 コンテンツ= log.Content、 CREATETIME =のDateTime。今 }); context.SaveChangesを返します(); } } }
Startup.cs
Microsoft.Extensions.DependencyInjectionを使用しました。 公共ボイドConfigureServices(IServiceCollectionサービス) { services.AddScoped <ILogRepository、LogRepository>(); services.AddMvc()SetCompatibilityVersion(CompatibilityVersion.Version_2_2)。 }
LogController.cs
[ルート( "API / [コントローラー]")] [ApiController] パブリッククラスLogController:ControllerBase { プライベート読み取り専用ILogRepository _logRepository。 公共LogController(ILogRepository logRepository) { _logRepository = logRepository。 } [HttpPost] 公共ボイドポスト([FromBody]値をログ) { _logRepository.Insert(値)。 } }
3. ASP.NETコアAutofacは、依存性注入を使用します
インストールパッケージを追加します。
インストール・パッケージAutofac.Extensions.DependencyInjection
Startup.cs:
使用してAutofacを。 使用してAutofac.Extensions.DependencyInjectionを。 // 使用第三方容器、Startup.ConfigureServices必须返回IServiceProvider 公共IServiceProvider ConfigureServices(IServiceCollectionサービス) { 。services.AddMvc()SetCompatibilityVersion(CompatibilityVersion.Version_2_2)。 // Autofacの VARのビルダー= 新しいContainerBuilder(); builder.RegisterType <LogRepository>()のような<ILogRepository> (); builder.Populate(サービス); VaRのコンテナ= builder.Build()。 返す 新しいAutofacServiceProvider(コンテナ)。 }