05 |依存性注入:良い出発点アーキテクチャ
なぜ使用の依存性注入フレームワーク
- 依存性注入フレームワークでは、我々は、コードの保守性とスケーラビリティを確保するために、アプリケーションを構築する際の設計原則に従うために私たちを助けて、クラス間の依存関係を簡単に管理することができます
- ASP.NETコアの全体構造は、依存性注入フレームワークは、さまざまなコンポーネントのコア機能オブジェクトの作成およびライフサイクル管理の依存性注入フレームワークを達成する能力によっても一緒に働くが、提供します
パッケージ
- Microsoft.Extensions.DependencyInjection.Abstractions
- Microsoft.Extensions.DependencyInjection
依存性注入は、パッケージが抽象である、二つ以上の成分パッケージの中核であり、特定の実装であります
ここで、分離モードを達成するために、インターフェイスを古典的なデザインパターンを使用
それが埋め込まれたときのアセンブリのみ実施することが可能で、特定の実装に依存することなく、抽象インタフェースに依存
この方法の利点は、あなたが使用中の特定の実装に決めることができるということです、それは将来の任意の拡張子を行うことができることを意味し、具体的な依存性注入フレームワークを置き換えます
デフォルトでは、.NETのコアは、サードパーティにも実装され、デフォルトの依存性注入フレームワークを置き換えるために使用することができる依存性注入フレームワークを提供使用して構築しました
コアタイプ
- IServiceCollection:登録サービス
- ServiceDescriptor:登録された各サービスの情報
- IServiceProvider:特定のコンテナ、ServiceCollectionビルドによって生成
- IServiceScope:コンテナの子コンテナのライフサイクル
ライフサイクル
- シングルトンシングルトン:ルートコンテナのライフサイクル全体を通じて単一の場合、いずれかのルートまたは子コンテナ容器との間の差の範囲である:グローバル、一の実施形態では、単一の範囲であります
- スコープスコープ:私はほっと場合のライフサイクルにおけるスコープ、コンテナや子コンテナ内のライフサイクルライフサイクルの中に、ある、コンテナは、私のオブジェクトが軽減されます
- 一時(一時的な)一時は:オブジェクトを取得するたびに、コンテナ内部からのブランドの新しいオブジェクトを取得することができます
新しいASP.NET WebアプリケーションのコアDependencyInjectionDemoを作成し、APIを選択
サービスフォルダの追加、3つのサービスライフサイクルサービスの3人の代表を作成します
namespace DependencyInjectionDemo.Services
{
public interface IMyScopedService { }
public class MyScopedService : IMyScopedService
{
}
}
namespace DependencyInjectionDemo.Services
{
public interface IMySingletonService { }
public class MySingletonService : IMySingletonService
{
}
}
namespace DependencyInjectionDemo.Services
{
public interface IMyTransientService { }
public class MyTransientService : IMyTransientService
{
}
}
スタートアップ登録サービスで
public void ConfigureServices(IServiceCollection services)
{
#region 注册服务不同生命周期的服务
// 将单例的服务注册为单例的模式
services.AddSingleton<IMySingletonService, MySingletonService>();
// Scoped 的服务注册为 Scoped 的生命周期
services.AddScoped<IMyScopedService, MyScopedService>();
// 瞬时的服务注册为瞬时的生命周期
services.AddTransient<IMyTransientService, MyTransientService>();
#endregion
services.AddControllers();
}
コントローラ内部の私たちのサービスを取得します。
// FromServices 标注的作用是从容器里面获取我们的对象
// 每个对象获取两遍,用于对比每个生命周期获取的对象是什么样子的
// HashCode 代表对象的唯一性
[HttpGet]
public int GetService(
[FromServices]IMySingletonService singleton1,
[FromServices]IMySingletonService singleton2,
[FromServices]IMyTransientService transient1,
[FromServices]IMyTransientService transient2,
[FromServices]IMyScopedService scoped1,
[FromServices]IMyScopedService scoped2)
{
Console.WriteLine($"singleton1:{singleton1.GetHashCode()}");
Console.WriteLine($"singleton2:{singleton2.GetHashCode()}");
Console.WriteLine($"transient1:{transient1.GetHashCode()}");
Console.WriteLine($"transient2:{transient2.GetHashCode()}");
Console.WriteLine($"scoped1:{scoped1.GetHashCode()}");
Console.WriteLine($"scoped2:{scoped2.GetHashCode()}");
Console.WriteLine($"========请求结束========");
return 1;
}
次のようにプログラムを起動し、アクセスインタフェースに再びブラウザをリフレッシュし、出力は次のようになります。
シングルトンは二回ハッシュコードを変更していません
瞬間的なサービスを意味二つの瞬間サービスの完全に異なる二回のhashCode、各要求は、新しいオブジェクトを取得します
各範囲内のサービス要求は、同じオブジェクトのインスタンスは、別の異なる要求間で得られます
この作品は、ある非営利- -同一条件許諾4.0の国際ライセンス契約クリエイティブ・コモンズのライセンスのために。
転載、使用、再投稿へようこそ、しかし鄭Ziming(リンクを含む:http://www.cnblogs.com/MingsonZheng/)によって署名された記事を保つようにしてください、商業目的のために使用してはならない、紙のライセンス変更に基づいて、同じ作業を公開するようにしてください。
ご質問があれば、私に連絡してください([email protected])。