我在控制檯應用程序中使用Unity 2.1.505.0,它由IDisposable
實現CarRepository
組成。然而,Dispose()
不在其範圍之外。以下是代碼示例:統一2控制檯應用程序中的IDisposable問題C#
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。或未來的其他工具。
處置是NEVER自動調用,它與Unity無關。 –
Unity.MVC可以解決這個問題。所以我認爲它會用於控制檯應用程序。 – Pingpong