ApplicationUserManagerでUnityで設定したDbContextを使用する方法

忙しいのですが、少し調べてみたのでメモします。

UnityConfig.csで設定したApplicationContextをApplicationUserManagerで利用するためには、Startup.Auth.csでUnityConfigで設定したApplicationContextを指定すればよい。

UnityConfig.cs

/// <summary>
/// Specifies the Unity configuration for the main container.
/// </summary>
public class UnityConfig
{
    private static readonly Logger Logger = LogManager.GetCurrentClassLogger();

    #region Unity Container
    private static Lazy<IUnityContainer> container = new Lazy<IUnityContainer>(() =>
    {
        var container = new UnityContainer();
        RegisterTypes(container);
        return container;
    });

    /// <summary>
    /// Gets the configured Unity container.
    /// </summary>
    public static IUnityContainer GetConfiguredContainer()
    {
        return container.Value;
    }
    #endregion

    /// <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: ここにDI対象の設定を行う
        container.RegisterType<AccountController>(new InjectionConstructor());
        container.RegisterType<ManageController>(new InjectionConstructor());

        // ApplicationDbContextの実行SQLをログに出力する
        container.RegisterType<ApplicationDbContext>(new PerRequestLifetimeManager(),
           new InjectionFactory(_ =>
           {
               var basicContext = new ApplicationDbContext();
               basicContext.Database.Log = s =>
               {
                   if (Logger.IsDebugEnabled)
                   {
                       Logger.Debug("SQL:{0}", s);
                   }
               };
               return basicContext;
           }));

        container.RegisterType<IApplicationUserRepository, ApplicationUserRepository>();
    }
}

Startup.Auth.cs

public partial class Startup
{
    // 認証設定の詳細については、http://go.microsoft.com/fwlink/?LinkId=301864 を参照してください
    public void ConfigureAuth(IAppBuilder app)
    {
        // UnityのContainerを取得する
        var container = UnityConfig.GetConfiguredContainer();

        // UnityContainerに設定されているApplicationDbContextを設定する。
        app.CreatePerOwinContext<ApplicationDbContext>((options, owinContext) => container.Resolve<ApplicationDbContext>());

        // 以下は変更なし
        app.CreatePerOwinContext<ApplicationUserManager>(ApplicationUserManager.Create);
        app.CreatePerOwinContext<ApplicationSignInManager>(ApplicationSignInManager.Create);
        ...
    }
}

これでApplicationDbContextをApplicationUserManagerと共有できるようになります。

ASP.NET MVC5実践プログラミング

ASP.NET MVC5実践プログラミング