EntityFramework
リポジトリを介してデータベースに物を保存するために使用する小さな webapp があります。
これまでに行ったこと (読んだすべてのチュートリアルに基づく) は、以下に示すように、必要な場所にリポジトリを作成することです。
でCustomMembershipProvider
:
public CustomMembershipProvider()
{
_userRepository = new UserRepository(new TenantApplicationContext());
}
私の中でRegisterController
:
public TenantRepository TenantRepository { get; set; }
public UserRepository UserRepository { get; set; }
protected override void Initialize(RequestContext requestContext)
{
if (MembershipService == null) { MembershipService = new AccountMembershipService(); }
if (TenantRepository == null) { TenantRepository = new TenantRepository(TenantApplicationContext); }
if (UserRepository == null) { UserRepository = new UserRepository(TenantApplicationContext); }
base.Initialize(requestContext);
}
ポイントは、UserRepository
2回インスタンス化することです。これは、あるインスタンスで を作成User
し、別のインスタンスでそれを取得しようとしたときに問題になり、その間に呼び出しを行いませんでし SaveChanges
た。
問題はここにあります:
// Snippet from the register controller class
if (!UserRepository.Exists(model.AccountableEmailAddress))
{
// 1 - Create the user via a custom MembershipProvider
// Note, the CustomMembershipProvider has it's own instance of UserRepository
var createStatus = MembershipService.CreateUser(
model.AccountableUser,
model.Password,
model.AccountableEmailAddress);
if (createStatus == MembershipCreateStatus.Success)
{
// Left out irrelevant code
AdministerUserAndTenant(tenant.Name, model.AccountableEmailAddress);
}
}
private void AdministerUserAndTenant(string tenantName, string emailAddress)
{
// 2 - Try to retrieve the user from a different (!) instance of UserRepository
var user = UserRepository.GetUser(emailAddress);
var tenant = TenantRepository.GetTenantByName(tenantName);
tenant.Users.Add(user);
TenantApplicationContext.SaveChanges();
}
引き続きフォローいただけると幸いです。不要な部分は省略してみました。
このような問題に対処する最善の方法は何ですか?
PS: 私はこのSingleton
パターンがあまり好きではないので、できればそこには行かないでください :)。