web-dev-qa-db-ja.com

プロパティまたはセッターメソッドを介したASP.NETコアMVC依存性注入

十分に文書化されています 、サービスに依存性を注入する方法があります。

質問:しかし、ASP.NET Core 2.0でシステムのDIメカニズムを使用することは(すでに)可能ですか自動的にサービスを注入しますメソッドまたはプロパティに?

補足:PHP-Symfonyでは、このパターンは セッターインジェクション と呼ばれます。

例:プロジェクト内のすべてのコントローラーに共通のMyBaseControllerクラスがあり、サービス(UserManagerサービスなど)が必要だとします。 MyBaseControllerに挿入され、後ですべての子コントローラーでアクセスできます。コンストラクターインジェクションを使用して、子クラスにサービスをインジェクトし、それをbase(userManager)を介して親に渡すことができます。しかし、すべてのコントローラーのすべての子コンストラクターでこれを実行する必要があるのは、かなり面倒です。

だから私は次のようにMyBaseControllerにセッターを置きたいと思います:

public abstract class MyBaseController : Controller
{
  public UserManager<User> userManager { get; set; }

  // system should auto inject UserManager here
  public void setUserManager(UserManager<User> userManager) {
    this.userManager = userManager;
  }
}

...したがって、依存関係を親に渡すためだけに、すべての子コンストラクターで次のことを行う必要はありません。

public class UsersController : MyBaseController
{
  public ChildController(UserManager<User> userManager) : base(userManager) {}

更新:与えられた答え ここ は私が達成したいことですが、質問はASP.NET Core 1.0に尋ねられました、私はASP.NET Core2.0にソリューションが追加されているかどうかに興味があります。

6
B12Toaster

一般に、コンストラクター以外のDIは少しアンチパターンと見なされるため、避けることをお勧めします。これについては、この 関連する質問 で適切な議論があります。

AspnetコアのデフォルトのMicrosoft.Extensions.DependencyInjectionコンテナーでは、答えはノーですが、この機能が本当に必要であることが確実な場合は、 autofac(プロパティインジェクションあり) のようなより強力なものに交換できます。 。

5
alastairtree