web-dev-qa-db-ja.com

Unity DIをASP.NET Identity用に構成する

リポジトリなどのすべての通常のコンストラクタインジェクションでUnityを使用していますが、ASP.NET IdentityクラスでUnityを動作させることができません。セットアップはこれです:

public class AccountController : ApiController
{
    private UserManager<ApplicationUser> _userManager { get; set; }

    public AccountController(UserManager<ApplicationUser> userManager)
    {
        if (userManager == null) { throw new ArgumentNullException("userManager"); }
        _userManager = userManager;
    }

    // ...
}

unityのこれらの構成:

unity.RegisterType<AccountController>();
unity.RegisterType<UserManager<ApplicationUser>>(new HierarchicalLifetimeManager());
unity.RegisterType<IUserStore<ApplicationUser>, UserStore<ApplicationUser>>(new HierarchicalLifetimeManager());

これは、Autofac、Ninjectなどの他の投稿と同じですが、私の場合は機能しません。エラーメッセージは次のとおりです。

タイプ「AccountController」のコントローラを作成しようとしたときにエラーが発生しました。コントローラにパラメータのないパブリックコンストラクタがあることを確認してください。もちろん手動での作成作業:

public AccountController()
    : this(new UserManager<ApplicationUser>(new UserStore<ApplicationUser>("Mongo")))
{
}

どうしましたか?

[〜#〜]更新[〜#〜]

@emodendroketで提案されているように、コードをこれに短縮するとうまくいきます。 Unity.Mvcパッケージは必要ありません。

unity.RegisterType<IUserStore<IdentityUser>, 
  MyCustomUserStore>(new HierarchicalLifetimeManager());

そして

public AccountController(UserManager<IdentityUser> _userManager,
  IAccountRepository _account)
{
    // ...
18
Benjamin E.

serManagerも解決する必要があります。以下は、serManagerおよびRoleManagerを使用してこれを行う方法の例です。このサンプルでは、​​派生物やブートストラップの1つではなく、通常のUnity 3パッケージを使用します(これまでにいくつかの問題がありました)。

AccountController

private readonly UserManager<ApplicationUser> _userManager;

private readonly RoleManager<IdentityRole> _roleManager;

public AccountController(IUserStore<ApplicationUser> userStore, IRoleStore<IdentityRole> roleStore)
{
  _userManager = new UserManager<ApplicationUser>(userStore);
  _roleManager = new RoleManager<IdentityRole>(roleStore);
}

nity Bootstrapper

var accountInjectionConstructor = new InjectionConstructor(new IdentitySampleDbModelContext(configurationStore));
container.RegisterType<IUserStore<ApplicationUser>, UserStore<ApplicationUser>>(accountInjectionConstructor);
container.RegisterType<IRoleStore<IdentityRole>, RoleStore<IdentityRole>>(accountInjectionConstructor);
21
Horizon_Net

このように enterpriseframework.comからのブログ投稿 は言う:

まず、Unity Bootstrapper for ASP.NET MVC Nugetパッケージを追加します。

  1. Visual Studioの「ソリューションエクスプローラー」で、Webプロジェクトの「参照」ノードを右クリックし、「NuGetパッケージの管理」をクリックします。

  2. 左側のメニューから、[オンライン]> [すべて]を選択します

  3. 右上の検索ボックス>オンラインで検索(Ctrl + E)>「ASP.NET MVCのUnityブートストラップ」と入力します。
  4. 「Unity Bootstrapper for ASP.NET MVC」を選択し、「インストール」を選択します。
  5. インストールが完了したら[閉じる]をクリックします

次に、your-Web-project/App_Start/UnityConfig.csファイルを変更し、usingステートメントを次のように更新します。

    using System;
    using System.Data.Entity;
    using Microsoft.AspNet.Identity;
    using Microsoft.AspNet.Identity.EntityFramework;
    using Microsoft.Practices.Unity;
    using Microsoft.Practices.Unity.Configuration;
    using MicrosoftIdentity.Controllers;
    using MicrosoftIdentity.Models;

最後に、同じファイルで、RegisterTypesメソッドを次のように更新します。

        public static void RegisterTypes(IUnityContainer container)
        {
            // NOTE: To load from web.config uncomment the line below. Make sure to add a Microsoft.Practices.Unity.Configuration to the using statements.
            // container.LoadConfiguration();

            // TODO: Register your types here
            container.RegisterType<IUserStore<ApplicationUser>, UserStore<ApplicationUser>>();
            container.RegisterType<UserManager<ApplicationUser>>();
            container.RegisterType<DbContext, ApplicationDbContext>();
            container.RegisterType<ApplicationUserManager>();
            container.RegisterType<AccountController>(new InjectionConstructor());
        }

HTH

14
Kamran