web-dev-qa-db-ja.com

アイデンティティプロバイダーとUnity Dependency Injection

ASP.NET MVC 5でIDプロバイダーの機能を試すことができるこのサンプルをダウンロードしました。

http://www.nuget.org/packages/Microsoft.AspNet.Identity.Samples

私は何度もUnity DIを私のリポジトリ、サービス、作業単位、およびその他のものに問題なく使用しました。

しかし今、Unity DIをインストールすると、アイデンティティプロバイダーを使用するインターフェイスとDIに多くの問題が発生します。

サンプルのコードをダウンロードし、Unity DIを構成しましたが、アイデンティティメンバーシップにUnityを使用したくありません。私だけのもの(IRepository、IService、IUnitOfWorkなど)にUnity DIを使用したいと思います。 )

ユーザーを登録しようとすると、このエラーが発生します。

現在のタイプ、Microsoft.AspNet.Identity.IUserStore`1 [Ecoavantis.Interactive.GCI.Models.ApplicationUser]はインターフェイスであり、構築できません。型マッピングがありませんか?

私はこのようなものを含める必要があると彼らが言ったいくつかの投稿を読みましたが、アイデンティティプロバイダーに依存関係を注入する必要はありません...

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

誰かが私を助けてくれますか?

コード例:

 /// <summary>Registers the type mappings with the Unity container.</summary>
        /// <param name="container">The unity container to configure.</param>
        /// <remarks>There is no need to register concrete types such as controllers or API controllers (unless you want to 
        /// change the defaults), as Unity allows resolving a concrete type even if it was not previously registered.</remarks>
        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<DbContext, ApplicationDbContext>(new ContainerControlledLifetimeManager());
            container.RegisterType<IUnitOfWorkAsync, UnitOfWork>(new PerRequestLifetimeManager());
            container.RegisterType<IMainPanelService, MainPanelService>();
            container.RegisterType(typeof (IRepositoryAsync<>), typeof (Repository<>));
            container.RegisterType<IDataContextAsync, ecoavantisinteractivegciContext>(new PerRequestLifetimeManager());
         }
31
chemitaxis

わかりました、問題を解決しました。この方法で依存関係を挿入しましたが、なぜ機能するのかよくわかりません...

今、アイデンティティは私のUnity DIで正常に動作します

container.RegisterType<AccountController>(new InjectionConstructor());
container.RegisterType<RolesAdminController>(new InjectionConstructor());
container.RegisterType<ManageController>(new InjectionConstructor());
container.RegisterType<UsersAdminController>(new InjectionConstructor());
48
chemitaxis

私の場合、RegisterComponentsメソッドのUnityConfig.csに以下を追加しました。

container.RegisterType<IUserStore<ApplicationUser>, UserStore<ApplicationUser>>();
13
Oladipo Olasemo

走路ありがとうございます!コメントするのに十分な担当者がいないので、新しい回答を投稿しています。 AccountControllerモデルプロパティを拡張したにもかかわらず、最初のUserを登録するだけでうまくいったように見えるため、ケミタキシスが最後の3つのコントローラーを自分で作成したと想定しています。

container.RegisterType<AccountController>(new InjectionConstructor());
9
hvaughan3

走化性とhvaughan3の回答の更新。あなたがユーザーを登録しようとしたときに起こると言っているので、それはおそらく標準のAccountControllerにあります。これの元の問題は、Unityが2つのパラメーターを使用してコンストラクターを呼び出そうとすることです。次に例を示します。

public AccountController(
    ApplicationUserManager userManager,
    ApplicationSignInManager signInManager)
{
    UserManager = userManager;
    SignInManager = signInManager;
}

次の行はUnityに代わりにパラメーターのないコンストラクターを呼び出すように指示し、他には何も必要としません。

container.RegisterType<AccountController>(new InjectionConstructor());

この説明がお役に立てば幸いです。

1
Ogglas