一文で読めるNetcore依存注入(Dependency injection)
8669 ワード
一文で読めるNetcore依存注入(Dependency injection)
一、依存注入とは何か
二、Asp.Netcoreにおける依存注入のライフサイクル
注入に依存するライフサイクルには3つのTransient,Scoped,Singletonがある.
1、Transientは呼び出しのたびに異なる例である、例えばよく使われるMicrosoft.Extensions.Options.IConfigureOptions;
2、Scopedは要求ごとに同じインスタンスであり、例えばEntity Framework contextsである.
3、SingletonはMicrosoftのような一例しかない.Extensions.Logging.ILogger;
具体的にどの種類を使うかは、具体的な状況によって決まる.
1、例えば、私たちの一般的なビジネスロジックはTransientで、これもよく使われています.
2、Scopedは相対的に少ないので、もちろん多くの業務ロジックもScopedを使うことができます.もちろん、彼の妙用は、システム内でログインシステムユーザーのIdを取得するなど、インスタンスを要求するたびにScopedを使用することができます.この場合、サービス層やRepository層などにかかわらず、同じユーザーを取得することができます.
3、Singletonの多くはシステムレベルの設計用単利で、例えばログである.
三、Asp.Netcoreでの依存注入の使用
基本ビジネスロジックコード、ユーザーリストの取得
public interface IUserInfoService
{
IEnumerable GetUserInfo();
}
public class UserInfoService : IUserInfoService
{
public IEnumerable GetUserInfo()
{
// db
return new List { new UserInfo { Id = 1, Name = "Emrys" }, new UserInfo { Id = 2, Name = " " } };
}
}
public class UserInfoMongoService : IUserInfoService
{
public IEnumerable GetUserInfo()
{
// Mongodb
return new List { new UserInfo { Id = 1, Name = "Emrys" }, new UserInfo { Id = 2, Name = " " } };
}
}
public class UserInfo
{
public int Id { get; set; }
public string Name { get; set; }
}
1、伝統方式
public class ValuesController : ControllerBase
{
IUserInfoService _userInfoService = new UserInfoService();
[HttpGet]
public IEnumerable Get()
{
return _userInfoService.GetUserInfo();
}
}
伝統的な方法の中で、ユーザーのサービス類を取得して直接newの方式を使って、これも多くの初心者あるいは多くのベテランが最もよく使う方式です;コード結合度が高すぎてメンテナンスに非常に不利であり、IUserInfoServiceに使用されるすべての場所でnewがオブジェクトから出ることがわかります.後で変更が必要な場合は、Mongodbからデータを取得するなど、IUserInfoServiceの実装を置き換える必要があります(実際の例では、ブラックボードからノースモービルバッテリに変更されます).では、すべてのnewでUserInfoServiceを出た場所でコードを変更してUserInfoMongoService、IUserInfoService_userInfoService = new UserInfoMongoService();
我々がnewを必要とするオブジェクトが単一のモード(Singleton)を実装する必要があり、newに1つのオブジェクト(Scoped)モードを要求するたびに、コード実装を別途書く必要がある.
2、依存注入方式
1、StartupクラスのConfigureServicesメソッドに注入を設定する
public void ConfigureServices(IServiceCollection services)
{
services.AddTransient ();
services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_1);
}
2、コンストラクション関数でインスタンスを取得する
public class ValuesController : ControllerBase
{
IUserInfoService _userInfoService;
public ValuesController(IUserInfoService userInfoService)
{
_userInfoService = userInfoService;
}
[HttpGet]
public IEnumerable Get()
{
return _userInfoService.GetUserInfo();
}
}
依存注入方式を用いる場合、従来方式の結合度は解決され、後で変更が実現される場合、services.AddTransientUserInfoService>();UserInfoMongoServiceに変更すればいいです.IUserInfoServiceを使用するすべての場所で変更する必要はありません.ライフサイクル(Transient,Scoped,Singleton)を非常に簡単に設定できます.
四、まとめ
1、注入を設定して取得する方法は一つだけではなく、例は最も簡単で最もよく使われる使用方法を示しただけで、他の方法はドキュメントを参照することができる.
2、取り替えることができる.Netcoreのデフォルトの注入容器、例えばよく使われるautofacは、より強力な機能を実現することができます.詳細はこちらhttps://autofac.org/;その他の容器は参考にできますhttps://github.com/aspnet/Extensions/tree/master/src/DependencyInjection
3、注入@inject IUserInfoService userInfoServiceをViewで直接入手できる
4、httpcontextで注入HttpContextを直接取得できる.RequestServices.GetService();
5、Startupの中のConfigureServicesの方法は注入を設定するために存在する.
お勧めを覚えています^^;