2

Unity Application Block を使用して依存関係をロードしています。すべての依存関係をロードすると、異常な動作をするという問題が発生します。

コンストラクター注入を使用してビジネス インターフェイスを使用するサービスがあり、そのビジネス インターフェイスはコンストラクター インジェクションとしてリポジトリ インターフェイスを使用します。私が抱えている問題は、データベースからユーザーの詳細をロードするときに、フィールド値が常に同じであることです (DB で手動で変更した後でも)。したがって、サービスを開くたびに同じインスタンス EntityFramework コンテキスト インスタンスを使用しているためだと思います。

Entity Framework に正しい詳細を読み込ませる唯一の方法は、IIS をリサイクルすることです。

Unity にその依存関係の新しいオブジェクト インスタンスを強制的に作成させ、WCF 要求が完了したときに強制的に破棄させる方法はありますか? 一時的なライフタイム マネージャーを使用してみましたが、問題は解決しません。

コード:

public class UserService : IUserService
{
    private IUserAdmin _UserBusiness { get; set; }

    public UserService()
    {

    }

    [InjectionConstructor]
    public UserService(IUserAdmin userBusiness)
        : this()
    {
        this._UserBusiness = userBusiness;
    }
}

public class UserAdmin : BusinessBase, IUserAdmin
{
    private IRepository<DBUserAccount> _UserRepository { get; set; }

    [InjectionConstructor]
    public UserAdmin(IRepository<DBUserAccount> userRepository)
    {
        this._UserRepository = userRepository;
    }
}

public class GenericRepository<T> : IDisposable, IRepository<T> where T : class, new()
{
    private Entities _Context;

    private ObjectSet<T> _ObjectSet;

    public GenericRepository()
    {
        this._Context = new Entities();
        this._ObjectSet = this._Context.CreateObjectSet<T>();
    }
}

ユニティ構成:

<register type="Services.Contracts.IUserService, Server.Services, Version=1.0.0.0, Culture=neutral, PublicKeyToken= 683f160d975782be"
            mapTo="Services.Implementations.UserService, Server.Services, Version=1.0.0.0, Culture=neutral, PublicKeyToken= 683f160d975782be">
    <lifetime type="transient"/>
  </register>
<register type="Server.Business.Users.IUserAdmin, Server.Business, Version=1.0.0.0, Culture=neutral, PublicKeyToken= 683f160d975782be"
            mapTo="Server.Business.Users.UserAdmin, Server.Business, Version=1.0.0.0, Culture=neutral, PublicKeyToken= 683f160d975782be">
    <lifetime type="transient"/>
  </register>
<register type="Server.DataLogic.IRepository`1[[Server.DataModels.DBUserAccount, Server.DataModels, Version=1.0.0.0, Culture=neutral, PublicKeyToken= 683f160d975782be]], Server.DataLogic, Version=1.0.0.0, Culture=neutral, PublicKeyToken= 683f160d975782be"
            mapTo="Server.DataLogic.GenericRepository`1[[Server.DataModels.DBUserAccount, Server.DataModels, Version=1.0.0.0, Culture=neutral, PublicKeyToken= 683f160d975782be]], Server.DataLogic, Version=1.0.0.0, Culture=neutral, PublicKeyToken= 683f160d975782be">
    <lifetime type="transient"/>
  </register>
4

1 に答える 1

0

アプリケーションに作業単位パターンが実装されていないようです。Unity の構成は正しいように見えますが、変更がコミットされていないようです。EntityFrameworkチームのこのブログ投稿を見て、実装方法を確認してください。また、この SO の質問と回答で説明されているように、作業単位をコミットするときに、実装が EntityFramework コンテキストを適切に破棄するようにする必要があります。

于 2012-08-21T14:09:29.383 に答える