Если я серфинга в http://localhost:58472/Account/Register
Я это исключениеСуществующие типы, IUserStore <ApplicationUser> и DbConnection, соответственно интерфейс и абстрактный класс и не могут быть построены
System.InvalidOperationException:
Текущий тип,IUserStore<ApplicationUser>
, является интерфейсом и не может быть сконструирован. Вам не хватает картографирования типов?
Вот мой код:
public class ApplicationUserManager : UserManager<ApplicationUser>
{
public ApplicationUserManager(IUserStore<ApplicationUser> store)
: base(store)
{ }
public static ApplicationUserManager Create(
IdentityFactoryOptions<ApplicationUserManager> options,
IOwinContext context)
{
var manager = new ApplicationUserManager(
new UserStore<ApplicationUser>(context.Get<ApplicationDbContext>())
);
// other code
return manager;
}
}
и вот код в контроллер:
[Authorize]
public class AccountController : Controller
{
private ApplicationSignInManager _signInManager;
private ApplicationUserManager _userManager;
public AccountController()
{
}
public AccountController(
ApplicationUserManager userManager,
ApplicationSignInManager signInManager)
{
UserManager = userManager;
SignInManager = signInManager;
}
public ApplicationSignInManager SignInManager
{
get
{
return _signInManager ??
HttpContext.GetOwinContext().Get<ApplicationSignInManager>();
}
private set
{
_signInManager = value;
}
}
public ApplicationUserManager UserManager
{
get
{
return _userManager ??
HttpContext.GetOwinContext().GetUserManager<ApplicationUserManager>();
}
private set
{
_userManager = value;
}
}
[HttpGet]
[AllowAnonymous]
public ActionResult Login(string returnUrl)
{
ViewBag.ReturnUrl = returnUrl;
return View();
}
}
Таким образом, вы можете увидеть, если вы читаете мой код, у меня ничего не изменилось в исходный код при создании нового проекта MVC, но у меня есть ошибка выше. Что я не так?
Я хорошо сделал новый контроллер с именем ProfileController
с тем же кодом, что и в моем втором блоке кода, но без ApplicationSignInManager
, потому что мне это не нужно.
Я также использую контейнер Unity для регистрации и управления сервисами. Вот код:
public static class UnityConfig
{
public static void RegisterComponents()
{
var container = new UnityContainer();
container.RegisterType<IGenericRepo<Category>, GenericRepo<Category>>();
container.RegisterType<ICategoryService, CategoryService>();
//container.RegisterType<IUser, ApplicationUser>();
DependencyResolver.SetResolver(new UnityDependencyResolver(container));
}
}
Если я раскомментирую строку в коде выше, при запуске сайта нет никакой разницы.
Update:
комментарием по @Jay я добавил этот код в менеджере Unity.
container.RegisterType<IUserStore<ApplicationUser>, UserStore<ApplicationUser>>();
Теперь у меня есть это исключение:
System.InvalidOperationException
: Текущий типа,System.Data.Common.DbConnection
, является абстрактным классом и не может быть построен. Вам не хватает картографирования типов?
Вот некоторая информация из трассировки стека произошла
InvalidOperationException
Ошибка при попытке создать контроллер типа
AccountController
. Удостоверьтесь, что контроллер имеет безкоммертный публичный конструктор.Да, у меня есть общественный конструктор без партикуляров.
ResolutionFailedException
Постановление зависимости не удалось, тип =
"AccountController"
, имя ="(none)"
.
Так я добавил эту строку в менеджере Unity:
container.RegisterType<IDbConnection, DbConnection>();
Но я до сих пор то же самое исключение.
Текущий тип,
System.Data.Common.DbConnection
...
Update:
По замечанием @RandyLevy Я попытался это, помогая этим вопросом Configure Unity DI for ASP.NET Identity:
Добавление этого к
AccountController
:// two fields added private readonly UserManager<ApplicationUser> _userManager; private readonly RoleManager<IdentityRole> _roleManager; // constructor added public AccountController( IUserStore<ApplicationUser> userStore, IRoleStore<IdentityRole> roleStore, ApplicationSignInManager signInManager) { _userManager = new UserManager<ApplicationUser>(userStore); _roleManager = new RoleManager<IdentityRole>(roleStore); SignInManager = signInManager; // I need this } public ApplicationSignInManager SignInManager // I need this { get { return _signInManager ?? HttpContext.GetOwinContext().Get<ApplicationSignInManager>(); } private set { _signInManager = value; } } public UserManager<ApplicationUser> UserManager // replace by other property // type of ApplicationUserManager { get { return _userManager ?? HttpContext.GetOwinContext().GetUserManager<ApplicationUserManager>(); } //private set // comment this because _usermanager is readonly. //{ // _userManager = value; //} } //public ApplicationUserManager UserManager // replaced by the property type of // // UserManager<ApplicationUser> //{ // get // { // return _userManager ?? // HttpContext.GetOwinContext().GetUserManager<ApplicationUserManager>(); // } // private set // { // _userManager = value; // } //}
Добавление этого в UnityManager:
InjectionConstructor accountInjectionConstructor = new InjectionConstructor(new ApplicationDbContext()); container.RegisterType<AccountController>(); container.RegisterType<IController, Controller>(); container.RegisterType <IRoleStore<IdentityRole>, RoleStore<IdentityRole>> (accountInjectionConstructor); // on this line container.RegisterType <IUserStore<ApplicationUser>, UserStore<ApplicationUser>> (accountInjectionConstructor);
Но я получил эту ошибку (нет времени запуска исключения) на линии с комментарием:
Тип
RoleStore<IdentityRole>
не может быть использован в качестве параметра типаTTo
в универсальном типе или метах спосо ниже:UnityContainerExtensions.RegisterType<TFrom, TTo> (IUnityContainer, params InjectionMember[])
Там нет неявного ссылочного преобразования из
RoleStore<IdentityRole>
вIRoleStore<IdentityRole>
.
Вам не хватает регистрационного типа для IUserStore? –
Jay
https://stackoverflow.com/questions/21927785/configure-unity-di-for-asp-net -identity может помочь. –
@Jay: Спасибо, за подсказку, но теперь у меня есть другое исключение. Больше информации в моем вопросе. –