0

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);
    }

ポイントは、UserRepository2回インスタンス化することです。これは、あるインスタンスで を作成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

それが問題になるのは具体的にいつですか?そこに答えがあるからです。お互いの保存されていない変更を認識する必要があるクラスは、同じリポジトリ インスタンスを使用する必要があります。それらはおそらく関連しているため、それらの間で参照を渡すことができます。

すべてのアプリケーションが 1 つのリポジトリを持つ必要がある理由がある場合は、依存関係の挿入を使用します。

于 2013-02-09T21:11:28.320 に答える