のようなusingステートメントですべてのdbContext呼び出しをラップする必要がありますか?
あなたのコンテキストをどのように使用するかによって決まります。この例を見てみましょう:あなたはHierarchicalLifetimeManager
でService
を登録した場合は何もサービスを配置しないので、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
。あなたのService
はTransient
だった、と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
}
}
また、を何が起こるかを検討してください。マネージャーは決して処分されないので、どちらもサービスではありません。マネージャは、コンテナのライフタイム全体にわたって同じサービスインスタンスを保持します。したがって私はを個人的にコンテナのコントロールの外にコンテキストの処分を維持することをお勧めします。 処分の連鎖があることを確認した場合、生命救助隊員の助けを借りて非常にうまく動作します。hereとcodereviewには、UoW with Unityの例がいくつか掲載されており、コンテキストを処分しています。
'var client = new dbContext()'を実行すると、Unityはコンテキストのライフサイクルとは何の関係もありません。 –