リポジトリなどのすべての通常のコンストラクタインジェクションで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)
{
// ...
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);
このように enterpriseframework.comからのブログ投稿 は言う:
まず、Unity Bootstrapper for ASP.NET MVC Nugetパッケージを追加します。
Visual Studioの「ソリューションエクスプローラー」で、Webプロジェクトの「参照」ノードを右クリックし、「NuGetパッケージの管理」をクリックします。
左側のメニューから、[オンライン]> [すべて]を選択します
次に、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