asp.net identitas 2.0 kesatuan tidak menyelesaikan penyimpanan pengguna default

saya mendapatkan pengecualian berikut ketika mencoba mengkonfigurasi Unity menggunakan Unity.Mvc5 dengan aplikasi MVC 5 menggunakan Identity 2.0 dan boilerplate Sampel Identity 2.0. saya telah membaca SO Konfigurasi Unity DI untuk Identitas ASP.NET dan saya masih belum jelas tentang apa yang saya lewatkan. Apa yang saya lakukan salah di sini?

Tipe saat ini, System.Data.Common.DbConnection, adalah kelas abstrak dan tidak dapat dibuat. Apakah Anda melewatkan pemetaan tipe?

[ResolutionFailedException: Resolusi ketergantungan gagal, ketik = "myApp.Web.Controllers.AccountController", name = "(none)". Pengecualian terjadi saat: saat menyelesaikan.

Pengecualiannya adalah: InvalidOperationException - Tipe saat ini, System.Data.Common.DbConnection, adalah kelas abstrak dan tidak dapat dibuat. Apakah Anda melewatkan pemetaan tipe?

Pada saat pengecualian, wadahnya adalah:

Menyelesaikan myApp.Web.Controllers.AccountController,(none) Menyelesaikan parameter "userManager" konstruktor myApp.Web.Controllers.AccountController(myApp.Web.Models.ApplicationUserManager userManager) Menyelesaikan myApp.Web.Models.ApplicationUserManager,(none) Menyelesaikan parameter "penyimpanan" konstruktor myApp.Web.Models.ApplicationUserManager(Microsoft.AspNet.Identity.IUserStore1[[myApp.Web.DAL.Profiles.ApplicationUser, myApp.Web, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null]] store) Resolving Microsoft.AspNet.Identity.EntityFramework.UserStore1[myApp.Web.DAL.Profiles.ApplicationUser],(none) (dipetakan dari Microsoft.AspNet.Identity.IUserStore1[myApp.Web.DAL.Profiles.ApplicationUser], (none)) Resolving parameter "context" of constructor Microsoft.AspNet.Identity.EntityFramework.UserStore1[[myApp.Web .DAL.Profiles.ApplicationUser, myApp.Web, Versi=1.0.0.0, Budaya=netral, PublicKeyToken=null]](Konteks System.Data.Entity.DbContext) Menyelesaikan System.Data.Entity.DbContext,(tidak ada) Parameter penyelesaian "ExistingConnection" dari konstruktor System.Data.Entity.DbContext(System.Data.Common.DbConnection eksistingConnection, System.Data.Entity.Infrastructure.DbCompiledModel model, System.Boolean konteksOwnsConnection) Menyelesaikan System.Data.Common.DbConnection,(tidak ada)

pengontrol akun karena saya telah memodifikasinya

 public AccountController(ApplicationUserManager userManager)
 {
      _userManager = userManager;
 }

 private ApplicationUserManager _userManager;

kontainer yang telah saya daftarkan

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

person Michael    schedule 22.04.2014    source sumber


Jawaban (2)


Saya melihat Anda menemukan solusinya, tetapi saya rasa saya punya solusi yang lebih sederhana.

Anda menggunakan Entity Framework, bukan? Jadi aplikasi Anda hampir pasti memiliki sesuatu yang diwarisi dari DbContext (mungkin mewarisi dari IdentityContext<TUser>, yang pada gilirannya mewarisi dari DbContext dalam kasus ini). Dalam templat defaultnya adalah ApplicationDbContext.

Di root komposisi Anda, Anda cukup menambahkan container.RegisterType<DbContext, ApplicationDbContext>(new HierarchicalLifetimeManager()); (tentu saja edit ini jika milik Anda tidak bernama ApplicationDbContext).

person Casey    schedule 23.04.2014
comment
Saya akan mencoba ini. ini tentu akan jauh lebih sederhana daripada harus membuat toko pengguna khusus saat saya tidak melakukan hal lain. - person Michael; 23.04.2014
comment
Benar, ya. Saya cukup yakin, melalui pesannya, bahwa ia gagal menyelesaikan DbContext, yang ingin disalin oleh kelas seperti UserManager. Anda juga dapat menggunakan InjectionFactory jika Anda menginginkannya. - person Casey; 23.04.2014
comment
bukankah lebih baik menggunakan PerRequestLifetimeManager daripada HierarchicalLifetimeManager ? - person Dragouf; 03.05.2014
comment
Ya, mungkin, jika Anda sudah menginstalnya di proyek Anda. Saya tetap berpegang pada apa yang ada dalam sampel. Saya yakin, saya juga bisa melakukan hal serupa dengan HLM dan wadah anak. - person Casey; 04.05.2014
comment
Apa yang terjadi jika saya memiliki 2 DbContexts? Satu untuk hal Identitas, sebut saja IdentityDb dan satu lagi untuk entitas bisnis, BusinessDb. - person Bogac; 24.08.2014
comment
@Bogac Anda memiliki dua pilihan -- Anda dapat menentukan di kelas mana yang Anda cari dan mendaftarkan keduanya sebagai tipe sebenarnya, atau Anda dapat mendaftarkan dua versi DbContext dengan kunci string yang berbeda dan kemudian menentukan dalam konfigurasi Unity Anda yang mana yang Anda inginkan. Jika itu tidak menjawab pertanyaan Anda, saya sarankan memposting pertanyaan terpisah dengan rincian lebih lanjut tentang apa yang Anda lakukan karena komentar bukanlah format yang ideal untuk membahas masalah ini. - person Casey; 25.08.2014
comment
Saya mencoba menambahkan DI ke konteks Entitas saya dan memiliki baris berikut di UnityConfig.cs container.RegisterType<DbContext, EntitiesDataContext>(new HierarchicalLifetimeManager()); Tapi saya masih mendapatkan kesalahan yang dibahas di sini. Ada ide? :-/ - person Felipe Correa; 24.08.2015
comment
@Casey Bisakah Anda melihat komentar di atas, saya lupa menyebutkan Anda ketika saya bertanya beberapa waktu lalu. Terima kasih! - person Felipe Correa; 24.08.2015
comment
@FelipeCorrea Anda bisa mendapatkan kesalahan yang sama untuk komponen apa pun. Mungkin Anda harus memposting pertanyaan Anda sendiri dengan jejak tumpukan penuh. - person Casey; 25.08.2015
comment
@Casey saya menyelesaikannya. EntitiesDataContext saya memiliki beberapa konstruktor dan saya tidak tahu bahwa Unity memilih konstruktor dengan lebih banyak parameter secara default. Saya harus menyebutnya seperti ini untuk memperbaikinya: container.RegisterType<DbContext, EntitiesDataContext>(new PerRequestLifetimeManager(), new InjectionConstructor()); InjectionConstructor membuat perbedaan :) - person Felipe Correa; 25.08.2015

oke, aku sudah menemukan jawabannya. menurut saya. saya membuat kelas userstore saya sendiri dan memasangnya. ini agak membantu. http://odetocode.com/blogs/scott/archive/2014/01/20/implementing-asp-net-identity.aspx

konfigurasi kesatuan

container.RegisterType<ApplicationDbContext>(new HierarchicalLifetimeManager());
container.RegisterType<IUserStore<ApplicationUser>, bcUserStore>(new HierarchicalLifetimeManager());

manajer pengguna

public static ApplicationUserManager Create(IdentityFactoryOptions<ApplicationUserManager> options, IOwinContext context)
{
   var manager = new ApplicationUserManager(new bcUserStore(context.Get<ApplicationDbContext>()));
// other code that's not relevant
}

toko pengguna

public class bcUserStore : IUserStore<ApplicationUser>
{
    private IDbSet<ApplicationUser> _users;
    private ApplicationDbContext _context;
    public bcUserStore(ApplicationDbContext context)
    {
        _users = context.Users;
        _context = context;
    }
    public System.Threading.Tasks.Task CreateAsync(ApplicationUser user)
    {
        user.Id = Guid.NewGuid().ToString();
        _users.Add(user);
        return _context.SaveChangesAsync();
    }

    public System.Threading.Tasks.Task DeleteAsync(ApplicationUser user)
    {
        _users.Remove(user);
        return _context.SaveChangesAsync();
    }

    public System.Threading.Tasks.Task<ApplicationUser> FindByIdAsync(string userId)
    {
        return _users.FirstOrDefaultAsync(x => x.Id == userId);
    }

    public System.Threading.Tasks.Task<ApplicationUser> FindByNameAsync(string userName)
    {
        return _users.FirstOrDefaultAsync(x => x.UserName == userName);
    }

    public System.Threading.Tasks.Task UpdateAsync(ApplicationUser user)
    {
        var current = _users.Find(user.Id);
        _context.Entry<ApplicationUser>(current).CurrentValues.SetValues(user);
        return _context.SaveChangesAsync();
    }

    public void Dispose()
    {
        _users = null;
        _context.Dispose();
    }
}
person Michael    schedule 22.04.2014