Структурная карта внедрения зависимостей ASP.NET Identity MVC 5

Я использую новую платформу идентификации ASP.NET MVC 5 для аутентификации. Я традиционно использовал StructureMap для внедрения зависимостей, но у меня возникли проблемы с его подключением для работы с новым AccountController.

Мои конструкторы AccountController выглядят так:

    public AccountController()
        : this(new UserManager<OmpUser>(new UserStore<OmpUser>(new OmpDbContext())))
    {    

    }

    public AccountController(UserManager<OmpUser> userManager)
    {
        UserManager = userManager;
    }

Моя конфигурация StructureMap выглядит так:

public static class IoC {
    public static IContainer Initialize() {
        ObjectFactory.Initialize(x =>
                    {
                        x.Scan(scan =>
                                {
                                    scan.TheCallingAssembly();
                                    scan.WithDefaultConventions();
                                });

                        //x.Register<IUserStore<OmpUser>>(() =>
                        //    new UserStore<OmpUser>(new OmpDbContext()));

                        x.For<OMPEntities>().HttpContextScoped();

                    });
        return ObjectFactory.Container;
    }
}

Когда я запускаю проект, я получаю следующую ошибку:

Ошибка активации при попытке получить экземпляр типа AccountController, ключ ""

Любые идеи о том, как создать новый объект UserManager для внедрения конструкции? Я пробовал искать вокруг, но не могу найти там много указаний.


person Sam Huggill    schedule 04.12.2013    source источник


Ответы (3)


Добавьте следующий код в метод инициализации контейнера.

x.For<Microsoft.AspNet.Identity.IUserStore<ApplicationUser>>()
.Use<Microsoft.AspNet.Identity.EntityFramework.UserStore<ApplicationUser>>();

x.For<System.Data.Entity.DbContext>().Use(() => new ApplicationDbContext());
person vinayklin    schedule 06.12.2013
comment
Ваш ответ сработал для меня для UserStore, однако я также добавил RoleStore и получаю сообщение об ошибке, говорящее об отсутствии неявного преобразования из RoleStore в IRoleStore. : x.For‹IRoleStore‹ApplicationRole››().Use‹RoleStore‹ApplicationRole››(); - person Greg; 12.10.2014
comment
@ Грег, ты нашел решение проблемы с RoleStore? - person Vikram; 16.12.2015

Добавление атрибута [DefaultConstructor] будет работать.

public class AccountController : Controller
{
    private ApplicationSignInManager _signInManager;
    private ApplicationUserManager _userManager;

    [DefaultConstructor]  //This is the attribute you need to add on the constructor
    public AccountController()
    {
    }
   // Other implementations here..........
}
person sethu madhav    schedule 23.07.2015

@vikram, это сработало для меня.

cfg.For<IRoleStore<IdentityRole,string>>().Use<RoleStore<IdentityRole>>(); 
person vicky    schedule 29.04.2016