0

MVC 5、Identity 2.x、Unity、およびDapperを使用して新しいプロジェクトを開始します。私はアイデンティティに標準のEF機能を使用していますが、残りのDBアクセスにはDapperを使用しています。私はすべての自分の(非アイデンティティ)DB呼び出しにリポジトリパターンを使用しています。MVCリポジトリ、Unity、アイデンティティエラー

私はUnityとDapperのにかなり新しいですが、gettinの維持「オブジェクト参照がオブジェクトのインスタンスに設定されていません。」エラー私はからアカウントコントローララインのDBインターフェイスへの呼び出しを行うたび以下:

var result = _companyaccountrepository.AddToCompanyUsers(model); 

誰かが間違っていることを指摘できますか?前もって感謝します。

アカウント・コントローラ

private ICompanyAccountRepository _companyaccountrepository { get; set; } 

public ICompanyAccountRepository companyaccountrepository 
{ 
    get { return _companyaccountrepository ?? (_companyaccountrepository = new CompanyAccountRepository()); } 
} 

private ApplicationUserManager _userManager; 
public ApplicationUserManager UserManager 
{ 
    get 
    { 
     return _userManager ?? HttpContext.GetOwinContext().GetUserManager<ApplicationUserManager>(); 
    } 
    private set 
    { 
     _userManager = value; 
    } 
} 


private ApplicationSignInManager _signInManager; 

public ApplicationSignInManager SignInManager 
{ 
    get 
    { 
     return _signInManager ?? HttpContext.GetOwinContext().Get<ApplicationSignInManager>(); 
    } 
    private set { _signInManager = value; } 
} 

public AccountController() 
{ 

} 

public AccountController(ApplicationUserManager userManager, ApplicationSignInManager signInManager, ICompanyAccountRepository companyaccountrepository) 
{ 
    UserManager = userManager; 
    SignInManager = signInManager; 
    _companyaccountrepository = companyaccountrepository; 
} 

... 

[HttpPost] 
[AllowAnonymous] 
[ValidateAntiForgeryToken] 
public async Task<ActionResult> SignUp(RegisterUserAndCompanyViewModel model) 
{ 
    if (ModelState.IsValid) 
    { 
     var user = new ApplicationUser { UserName = model.Email, Email = model.Email }; 

     user.FirstName = model.FirstName; 
     user.LastName = model.LastName; 

     var result = await UserManager.CreateAsync(user, model.Password); 
     if (result.Succeeded) 
     { 

      await SignInManager.SignInAsync(user, isPersistent: false, rememberBrowser: false); 

      var result = _companyaccountrepository.AddToCompanyUsers(model); //*** THIS IS WHERE THE PROBLEM OCCURS **** 

      return RedirectToAction("Confirmation"); 

     } 
     AddErrors(result); 
    } 

    // If we got this far, something failed, redisplay form 
    return View(model); 
} 

インタフェース/ DapperのSQL(それを簡単にするダミーコード)

public interface ICompanyAccountRepository 
{ 
    CompanyUser AddToCompanyUsers(RegisterUserAndCompanyViewModel user); 

} 


public class CompanyAccountRepository : ICompanyAccountRepository 
{ 
    private string dbconn = ConfigurationManager.ConnectionStrings["DefaultConnection"].ConnectionString; 

    public bool AddToCompanyUsers(RegisterUserAndCompanyViewModel user); 
    { 
     using (SqlConnection cn = new SqlConnection(dbconn)) 
     { 
      cn.Open(); 
      cn.Insert(new CompanyUser() { CompanyId = user.companyid, UserId = user.id }); 
      cn.Close(); 

     } 

     return true; 

    } 

} 

Unity.Config

public static void RegisterTypes(IUnityContainer container) 
{ 
    // NOTE: To load from web.config uncomment the line below. Make sure to add a Microsoft.Practices.Unity.Configuration to the using statements. 
    // container.LoadConfiguration(); 

    // TODO: Register your types here 

    //12-1-16 Need this for Identity 
    container.RegisterType<ApplicationDbContext>(); 
    container.RegisterType<ApplicationSignInManager>(); 
    container.RegisterType<ApplicationUserManager>(); 
    container.RegisterType<EmailService>(); 

    container.RegisterType<IAuthenticationManager>(
     new InjectionFactory(c => HttpContext.Current.GetOwinContext().Authentication)); 

    container.RegisterType<IUserStore<ApplicationUser>, UserStore<ApplicationUser>>(
     new InjectionConstructor(typeof(ApplicationDbContext))); 


    container.RegisterType<AccountController>(
     new InjectionConstructor(typeof(ApplicationUserManager), typeof(ApplicationSignInManager), typeof(ICompanyAccountRepository))); 

    container.RegisterType<AccountController>(
      new InjectionConstructor()); 


    //Identity/Unity stuff below to fix No IUserToken Issue - http://stackoverflow.com/questions/24731426/register-iauthenticationmanager-with-unity 
    //container.RegisterType<DbContext, ApplicationDbContext>(
    // new HierarchicalLifetimeManager()); 
    container.RegisterType<UserManager<ApplicationUser>>(
     new HierarchicalLifetimeManager()); 
    container.RegisterType<IUserStore<ApplicationUser>, UserStore<ApplicationUser>>(
     new HierarchicalLifetimeManager()); 

     container.RegisterType<ICompanyAccountRepository, CompanyAccountRepository>(); 

} 

ご意見ありがとうございました。

注記:AddToCompanyUsersが(下記)を呼び出す直前にリポジトリをインスタンス化すると正常に動作します。

(これはあなたのリポジトリのエラーを修正する必要がありますあなたのUserManagerとsignInManagerについては、私は信じてあなたは彼らのように構成されている方法を改善することができます。しかし、これはユニティ/ IOC

_companyaccountrepository= new CompanyAccountRepository(); 
var result = _companyaccountrepository.AddToCompanyUsers(model); 
+1

アカウントコントローラは、単にデフォルトコンストラクタで初期化されます。だから_companyaccountrepositoryはインスタンス化されません –

+0

@シムコ - アドバイスをいただきありがとうございます。私はデフォルトのコンストラクタを削除しようとしましたが、私がそれを行ったとき、Identity(Unity経由で)機能が破損しました –

+0

スタックトレースと内部例外をポストしてください。 –

答えて

0

は、あなたがこのようにそれを試すことができます破りますまあ、それはあなたのstartup.authとあなたのApplicationDbContextの表情を取るために取ると、すべてのアイデンティティの構成となります)

アカウント・コントローラ

private readonly ICompanyAccountRepository _companyaccountrepository;// { get; set; } -- remove the getter and setter here 



//remove this 

// public ICompanyAccountRepository companyaccountrepository 
// { 
//  get { return _companyaccountrepository ?? (_companyaccountrepository = new CompanyAccountRepository()); } 
// } 

private ApplicationUserManager _userManager; 
public ApplicationUserManager UserManager 
{ 
    get 
    { 
     return _userManager ?? HttpContext.GetOwinContext().GetUserManager<ApplicationUserManager>(); 
    } 
    private set 
    { 
     _userManager = value; 
    } 
} 


private ApplicationSignInManager _signInManager; 

public ApplicationSignInManager SignInManager 
{ 
    get 
    { 
     return _signInManager ?? HttpContext.GetOwinContext().Get<ApplicationSignInManager>(); 
    } 
    private set { _signInManager = value; } 
} 

//I think you can remove the parameterless constructor as well 
//public AccountController() 
//{ 
// 
//} 

public AccountController(ApplicationUserManager userManager, ApplicationSignInManager signInManager, ICompanyAccountRepository companyaccountrepository) 
{ 
    UserManager = userManager; 
    SignInManager = signInManager; 
    _companyaccountrepository = companyaccountrepository; 
} 

... 

EDIT

変更あなたのコンストラクタに:

public AccountController(ICompanyAccountRepository companyaccountrepository) 
{ 
    _companyaccountrepository = companyaccountrepository; 
} 
+0

あなたの編集では、これは動作しているようです。 2つのコンストラクタが必要ですか? public AccountController(ApplicationUserManager userManager、ApplicationSignInManager signInManager、ICompanyAccountRepository companyaccountrepository)&public AccountController(ICompanyAccountRepository companyaccountrepository) –

+0

この場合、2つのコンストラクタは必要ありません。 UserManagerとSignInManagerを別々のプロパティとして設定しているため、コンストラクタでそれらを注入する必要はありません。 – Issac

関連する問題