1

ASP.NET MVC アプリケーションを取得し、最初に EF コードと Unity 依存関係インジェクターを使用しています。DDD 設計を実装し、POCO オブジェクトとやり取りするリポジトリとサービスを用意しました。

私の問題は、接続が閉じられた、エンティティが変更された、追跡されていないなど、EF関連の問題が発生していることです。Google での調査から理解したように、Unity の構成方法に関連していました。

リクエストインスタンスごとに配置する必要があることは理解しましたが、UnityにもUni​​ty.Mvc3パッケージにも組み込みの戦略はありません。私は多くの問題を解決した独自の戦略を書こうとしましたが、「接続が閉じられる」ことがあるという問題に固執しています。

私の HttpContextLifetimeManager.cs

public class HttpContextLifetimeManager<T> : LifetimeManager, IDisposable
{
    public override object GetValue()
    {
        return HttpContext.Current.Items[typeof(T).AssemblyQualifiedName];
    }

    public override void RemoveValue()
    {
        HttpContext.Current.Items.Remove(typeof(T).AssemblyQualifiedName);
    }

    public override void SetValue(object newValue)
    {
        HttpContext.Current.Items[typeof(T).AssemblyQualifiedName] = newValue;
    }

    public void Dispose()
    {
        RemoveValue();
    }
}

そして、DependencyConfig.cs (MVC 4 App_Start) 内で、次を使用して登録しています。

container.RegisterInstance<MyDbContext>(new MyDbContext(), new HttpContextLifetimeManager<DependencyConfig>());

機能する実装をお勧めします/私の問題を修正するのに役立ちます/その問題を解決するのに役立つ記事またはチュートリアルに転送してくれますか?

どうもありがとう。

4

1 に答える 1

1

App_Startメソッドは、最初のリクエストがアプリケーションに送信されたときに 1 回だけ呼び出されます。

    Called when the first resource (such as a page) in an ASP.NET application is requested.  
 The Application_Start method is called only one time during the life cycle of an application.  

MSDNを参照

したがって、すべてのリクエストに対して 1 つのコンテキストを作成しています。その後、場合によっては処分することもあります。また、すべてのリクエストに対して 1 つの DbContext を保持することはお勧めできません (メモリの問題など)。
したがって、そのコードを に入れてみることができますApplication_BeginRequest

于 2013-01-25T03:49:53.840 に答える