我有一个小型的webapp,它使用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
模式,所以如果可能的话不要去那里:)。
答案 0 :(得分:1)
什么时候成为问题?因为这就是答案所在。应该知道彼此未保存的更改的类应该使用相同的存储库实例。由于它们可能是相关的,因此您将管理它们之间的引用。
如果您的所有应用程序都有一个存储库的原因,请使用依赖注入。