private IContainer _container;
private ContainerBuilder _containerBuilder;
[Test]
public void ChildScopeShouldResolveSingletonFromAncestorScope()
{
// ARRANGE
_containerBuilder = new ContainerBuilder();
RegisterOwner<IHouse, House>("HouseScope");
RegisterSingletonPerOwner<IElectricitySupply, ElectricitySupply>("HouseScope");
RegisterOwner<IRoom, Room>("RoomScope", "HouseScope");
RegisterSingletonPerOwner<IApplianceController, ApplianceController>("RoomScope");
_containerBuilder.RegisterType<Room>();
_containerBuilder.RegisterType<House>();
_containerBuilder.RegisterType<Appliance>();
_container = _containerBuilder.Build();
// ACT
var housesWorkspace = _container.Resolve<IHouse>();
var house = _container.Resolve<IRoom>();
var appliance = house.CreateAppliance();
// ASSERT
Assert.IsNotNull(housesWorkspace);
Assert.IsNotNull(house);
}
public void RegisterOwner<TInterface, TConcrete>(string key, string parentKey = null)
where TConcrete : TInterface
{
_containerBuilder.Register<TInterface>(
c =>
{
var lifetimeScope = _container.BeginLifetimeScope(key);
var concrete = lifetimeScope.Resolve<TConcrete>();
return concrete;
});
}
public void RegisterSingletonPerOwner<TInterface, TConcrete>(string key) where TConcrete : TInterface
{
_containerBuilder.RegisterType<TConcrete>()
.As<TInterface>()
.InstancePerMatchingLifetimeScope(key);
}
public interface IHouse : IDisposableObject
{
IRoom Room { get; set; }
}
public class House : DisposableObject, IHouse
{
public House(IRoom house)
{
Room = house;
}
public IRoom Room { get; set; }
}
public interface IRoom : IDisposableObject
{
Appliance CreateAppliance();
}
public class Room : DisposableObject, IRoom
{
private readonly Func<Appliance> _applianceFactory;
public Room(Func<Appliance> applianceFactory, IApplianceController applianceController)
{
_applianceFactory = applianceFactory;
}
public Appliance CreateAppliance()
{
return _applianceFactory();
}
}
public interface IApplianceController : IDisposableObject { }
public class ApplianceController : DisposableObject, IApplianceController { }
public class Appliance : DisposableObject
{
public Appliance(IApplianceController applianceController, IElectricitySupply workspaceService) { }
}
public interface IElectricitySupply : IDisposableObject { }
public class ElectricitySupply : DisposableObject, IElectricitySupply { }