2

I'm having problems to register some dependencies like this one.

No default Instance is registered and cannot be automatically determined for type 'IUserStore<ApplicationIdentityUser, Int32>'

There is no configuration specified for IUserStore<ApplicationIdentityUser, Int32>


1.) new UserManager`2(*Default of IUserStore<ApplicationIdentityUser, Int32>*)
2.) UserManager<ApplicationIdentityUser, Int32>
3.) Instance of UserManager<ApplicationIdentityUser, Int32>
4.) new ApplicationUserManager(*Default of UserManager<ApplicationIdentityUser, Int32>*, *Default of IAuthenticationManager*)
5.) MyClinic.Infra.Data.Identity.ApplicationUserManager
6.) Instance of MyClinic.Core.Identity.IApplicationUserManager (MyClinic.Infra.Data.Identity.ApplicationUserManager)
7.) new AccountController(*Default of IApplicationUserManager*)
8.) MyClinic.Web.Controllers.AccountController
9.) Instance of MyClinic.Web.Controllers.AccountController
10.) Container.GetInstance(MyClinic.Web.Controllers.AccountController)

Could someone help me ?

My account controller is:

public class AccountController : Controller
{
    private IApplicationUserManager _userManager;
    public AccountController(IApplicationUserManager userManager)
    {
        _userManager = userManager;
    }
}

My application user manager:

public class ApplicationUserManager : IApplicationUserManager
{
    private readonly UserManager<ApplicationIdentityUser, int> _userManager;
    private readonly IAuthenticationManager _authenticationManager;
    private bool _disposed;

    public ApplicationUserManager(UserManager<ApplicationIdentityUser, int> userManager, IAuthenticationManager authenticationManager)
    {
        _userManager = userManager;
        _authenticationManager = authenticationManager;
    }
}

2 Answers2

16

You need to add the following to your structuremap Container to work with Asp.net Identity.

For<IUserStore<ApplicationUser>>().Use<UserStore<ApplicationUser>>();
For<DbContext>().Use(() => new ApplicationDbContext());
For<IAuthenticationManager>().Use(() => HttpContext.Current.GetOwinContext().Authentication);

In addition, you will need to install the package

Microsoft.Owin.Host.SystemWeb

to get the extension method GetOwinContext() to appear on HttpContext.Current

Rich Hildebrand
  • 1,607
  • 17
  • 15
0

For me, I had to add this line of code:

cfg.AddRegistry(new AspNetIdentityRegistry());

To my StructureMapConfig class:

using Heroic.Web.IoC;
using MyCorprateCRM.Web.Identity;
using System.Web.Http;
using System.Web.Mvc;
using StructureMap;
using StructureMap.Graph;

[assembly: WebActivatorEx.PreApplicationStartMethod(typeof(RoundlabCRM.Web.StructureMapConfig), "Configure")]
namespace RoundlabCRM.Web
{
    public static class StructureMapConfig
    {
        public static void Configure()
        {
            ObjectFactory.Configure(cfg =>
            {
                cfg.Scan(scan =>
                {
                    scan.TheCallingAssembly();
                    scan.WithDefaultConventions();
                });

                cfg.AddRegistry(new ControllerRegistry());
                cfg.AddRegistry(new MvcRegistry());
                cfg.AddRegistry(new ActionFilterRegistry(namespacePrefix: "RoundlabCRM.Web"));
                cfg.AddRegistry(new AspNetIdentityRegistry());

                //TODO: Add other registries and configure your container!
            });

            var resolver = new StructureMapDependencyResolver();
            DependencyResolver.SetResolver(resolver);
            GlobalConfiguration.Configuration.DependencyResolver = resolver;
        }
    }
}

Where AspNetIdentityRegistry is:

using System.Data.Entity;
using System.Web;
using MyCorprateCRM.Model.Entities;
using Microsoft.AspNet.Identity;
using Microsoft.AspNet.Identity.EntityFramework;
using Microsoft.Owin.Security;
using StructureMap.Configuration.DSL;

namespace MyCorprateCRM.Web.Identity
{
    public class AspNetIdentityRegistry : Registry
    {
        public AspNetIdentityRegistry()
        {
            For<IUserStore<User>>().Use<UserStore<User>>();
            For<DbContext>().Use<AppDbContext>();
            For<IAuthenticationManager>().Use(ctx => ctx.GetInstance<HttpRequestBase>().GetOwinContext().Authentication);
        }
    }
}
user8128167
  • 6,929
  • 6
  • 66
  • 79