应该将存储库作为最佳实践作为单例来实现吗?

时间:2013-02-09 21:07:16

标签: c# entity-framework repository

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

1 个答案:

答案 0 :(得分:1)

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

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