10

Identity 2.0 と Identity 2.0 Samples ボイラープレートを使用する MVC 5 アプリケーションで Unity.Mvc5 を使用して Unity を構成しようとすると、次の例外が発生します。私はこの SO Configure Unity DI for ASP.NET Identityを読みましたが、何が欠けているのかまだはっきりしていません。ここで何が間違っていますか?

現在の型 System.Data.Common.DbConnection は抽象クラスであり、構築できません。タイプマッピングがありませんか?

[ResolutionFailedException: 依存関係の解決に失敗しました。タイプ = "myApp.Web.Controllers.AccountController"、名前 = "(none)"。例外が発生しました: 解決中。

例外は次のとおりです。 InvalidOperationException - 現在の型 System.Data.Common.DbConnection は抽象クラスであり、構築できません。タイプマッピングがありませんか?

例外発生時のコンテナは次のとおりでした。

myApp.Web.Controllers.AccountController,(none) の解決中 コンストラクタ myApp.Web.Controllers.AccountController(myApp.Web.Models.ApplicationUserManager userManager) のパラメータ「userManager」の解決中 myApp.Web.Models.ApplicationUserManager,(none) 解決中のパラメータコンストラクタ myApp.Web.Models.ApplicationUserManager(Microsoft.AspNet.Identity.IUserStore 1[[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) の「ストア」(Microsoft.AspNet.Identity.IUserStore からマップ)1[myApp.Web.DAL.Profiles.ApplicationUser], (none)) Resolving parameter "context" of constructor Microsoft.AspNet.Identity.EntityFramework.UserStore1[[myApp.Web.DAL.Profiles.ApplicationUser, myApp.Web, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null]](System.Data.Entity.DbContext コンテキスト) System.Data.Entity.DbContext の解決,(none) コンストラクタ System.Data.Entity.DbContext(System.Data.Common.DbConnection existingConnection, System.Data.Entity.Infrastructure.DbCompiledModel model, System.Boolean contextOwnsConnection) のパラメータ「existingConnection」を解決中 System.Data.Common を解決中.DbConnection,(なし)

変更したアカウントコントローラー

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

 private ApplicationUserManager _userManager;

登録したコンテナ

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

2 に答える 2

22

解決策を見つけたようですが、もっと簡単な解決策があると思います。

Entity Framework を使用していますね。したがって、アプリケーションにはほぼ確実に から継承するものがありますDbContext(おそらく からIdentityContext<TUser>継承し、この場合は から継承しDbContextます)。デフォルトのテンプレートでは、ApplicationDbContext です。

コンポジションルートに追加するだけcontainer.RegisterType<DbContext, ApplicationDbContext>(new HierarchicalLifetimeManager());です(ApplicationDbContextと呼ばれていない場合は、明らかにこれを編集してください)。

于 2014-04-23T13:19:48.343 に答える
2

わかりました。おもう。私は独自のユーザーストアクラスを作成してプラグインしました。これは多少役に立ちました。http://odetocode.com/blogs/scott/archive/2014/01/20/implementing-asp-net-identity.aspx

団結構成

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

ユーザーマネージャー

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

ユーザーストア

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();
    }
}
于 2014-04-22T17:22:30.497 に答える