0

我有一个小型 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模式,所以如果可能的话不要去那里:)。

4

1 回答 1

1

究竟什么时候会成为问题?因为这就是答案所在。应该知道彼此未保存更改的类应该使用相同的存储库实例。由于它们可能是相关的,因此您将管理在它们之间传递引用。

如果您的所有应用程序都应该有一个存储库是有原因的,请使用依赖注入。

于 2013-02-09T21:11:28.320 回答