![](/img/trans.png)
[英]How do I structure a C# console application to efficiently use IDisposable database resources?
[英]Unity 2 IDisposable Issue in Console Application C#
我在控制台應用程序中使用Unity 2.1.505.0,該應用程序由一個IDisposable
實現CarRepository
。 但是,不在其范圍內時永遠不會調用Dispose()
。 下面是代碼示例:
internal class Program
{
private static void Main(string[] args)
{
CarShop.Entry();
}
}
class CarShop
{
static UnityContainer unityContainer = new UnityContainer();
public static void Entry()
{
unityContainer.RegisterType<ICarRepository, CarRepository>();
var carShop = new CarShop();
carShop.BuyCar();
}
public void BuyCar()
{
CheckCar();
}
private void CheckCar()
{
var carService = unityContainer.Resolve<CarService>();
var car = carService.GetCar(1);
// **Dispose() method is not called out of this scope**
}
}
class CarService
{
private ICarRepository carRepository;
public CarService(ICarRepository carRepository)
{
this.carRepository = carRepository;
}
public Car GetCar(int id)
{
return this.carRepository.GetCar(id);
}
}
interface ICarRepository
{
Car GetCar(int id);
}
class CarRepository : ICarRepository, IDisposable
{
public Car GetCar(int id)
{
return null;
}
public void Dispose()
{
}
}
public class Car
{
}
任何想法??
更新資料
正如@nemesv建議的解決方案:
unityContainer.RegisterType<ICarRepository, CarRepository>(
new HierarchicalLifetimeManager())
using (var childContainer = unityContainer.CreateChildContainer())
{
var carService = childContainer.Resolve<CarService>();
var car = carService.GetCar(1);
}
有用。 但是與Unity.MVC
不同,它需要顯式創建childContainer
。 是否有透明的方式處理IDispose
對象,如Unity.MVC。 或其他將來的工具。
默認情況下, RegisterType
方法使用TransientLifetimeManager
,該方法不存儲對創建的對象的引用,因此不會為您調用Dispose
。
在構建的LifetimeManager
實現中,只有ContainerControlledLifetimeManager
處理容器本身時處理托管對象。
您可以在此處閱讀有關生命周期管理器的信息: 了解生命周期管理器
如果您的目標是在使用后處置CarRepository
,則可以使用HierarchicalLifetimeManager
和子容器來實現它:
public static void Entry()
{
unityContainer.RegisterType<ICarRepository, CarRepository>(
new HierarchicalLifetimeManager());
var carShop = new CarShop();
carShop.BuyCar();
}
private void CheckCar()
{
using (var childContainer = unityContainer.CreateChildContainer())
{
var carService = childContainer.Resolve<CarService>();
var car = carService.GetCar(1);
}
// **Dispose() method is not called out of this scope**
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.