2016-10-07 4 views
0

私はUnityとEntity FrameworkをWeb API 2アプリケーションで使用しています。私はHierarchicalLifetimeManager.HierarchicalLifetimeManagerを使用したUnity。 Entity Frameworkで 'Using'ステートメントが必要ですか

var container = new UnityContainer(); 
container.RegisterType<IService, Service>(new HierarchicalLifetimeManager()); 

とタイプを登録する私はすべての私のdbContextはこのようなusingステートメントで呼び出しをラップする必要がありますか?これは必要ですか?私はUnityが私のために文脈を破棄すると思った。

using (var client = new dbContext()) 
{ 
    var result = client.Customers.toList(); 
} 

または私はちょうどusing声明なしdbContextを使用することができますか?

+1

'var client = new dbContext()'を実行すると、Unityはコンテキストのライフサイクルとは何の関係もありません。 –

答えて

0

のようなusingステートメントですべてのdbContext呼び出しをラップする必要がありますか?

あなたのコンテキストをどのように使用するかによって決まります。この例を見てみましょう:あなたはHierarchicalLifetimeManagerServiceを登録した場合は何もサービスを配置しないので、contextを配置することはありませんので、

public class Service : IService, IDisposable 
{ 
    private DbContext _context; 
    public Service(DbContext context) 
    { 
     _context = context; 
    } 

    public object Get(int id) 
    { 
     return _context.Customers.Find(id); 
    } 

    public object Update(object obj) 
    { 
     // Code for updating 
    } 

    public void Dispose() 
    { 
     _context.Dispose(); 
    } 
} 

contextはpractially、配置されることはありません。しかし、上記の例はTransientLifetimeManagerで正常に動作するはずです。 MSDNから

HierarchicalLifetimeManager。この寿命管理のために、 ContainerControlledLifetimeManagerに関しては、Unityは 登録タイプの同じインスタンスを返すまたは依存機構が他のクラスにインスタンス を注入するときに解決するか ResolveAll法またはを呼び出すたびにオブジェクト。

代わりに各方法で処分すると、あなたが使用しているライフタイムマネージャーに関係なく正しく処分されます。また、IServiceの消費者は、処理を気にする必要はありませんIService。あなたのServiceTransientだった、とContainerControllerあるマネージャーに注入された場合

public class Service : IService 
{ 

    public object Get(int id) 
    { 
     using (var context = new DbContext()) 
     { 
      return context.Customers.Find(id); 
     } 
    } 

    public object Update(object obj) 
    { 
     // Code for updating 
    } 
} 

また、を何が起こるかを検討してください。マネージャーは決して処分されないので、どちらもサービスではありません。マネージャは、コンテナのライフタイム全体にわたって同じサービスインスタンスを保持します。したがって私はを個人的にコンテナのコントロールの外にコンテキストの処分を維持することをお勧めします。 処分の連鎖があることを確認した場合、生命救助隊員の助けを借りて非常にうまく動作します。herecodereviewには、UoW with Unityの例がいくつか掲載されており、コンテキストを処分しています。

関連する問題