2016-12-11 24 views
0

我開始使用MVC 5,Identity 2.x,Unity和Dapper創建一個新項目。我爲身份使用標準EF功能,但使用Dapper來訪問其他數據庫。我爲所有我的(非身份)數據庫調用使用存儲庫模式。MVC Repository,Unity,Identity Error

我是相當新的團結和小巧玲瓏但保持剛開了「對象引用不設置到對象的實例。」錯誤,每當我做出從賬戶控制器線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); 
} 

接口/小巧玲瓏的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調用之前添加實例化存儲庫(如下所示),它可以正常工作。然而,這打破統一組織/國際奧委會

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

您的帳戶控制器可以簡單地通過默認構造函數初始化。所以_companyaccountrepository從未例化 –

+0

@simco - 感謝您的建議。我嘗試刪除默認的構造函數,但當我這樣做時,它打破了身份(通過Unity)的功能 –

+0

請發佈堆棧跟蹤和內部異常。 –

回答

0

,您可以嘗試這樣的:

(這應該解決您的存儲庫錯誤至於你的UserManager和signInManager,我相信你可以提高它們是如何配置。好,但這需要採取的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; 
} 

... 

編輯

更改您的構造函數:

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