我有一个小型 web 应用程序,用于EntityFramework
通过存储库将内容存储到数据库中。
到目前为止,我所做的(基于我阅读的所有教程)是在我需要的地方创建一个存储库,如下所示:
在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
两次。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
模式,所以如果可能的话不要去那里:)。