То, что вы хотите, звучит как вариант диспетчера ContainerControlledLifetime, который не поддерживает одноэлементный экземпляр, а набор экземпляров.К сожалению, это не один из встроенных менеджеров времени жизни.
Вы можете посмотреть код для ContainerControlledLifetimeManager и увидеть, что это довольно просто.Ваша реализация «SynchronizedGetValue» всегда будет возвращать ноль (сигнализируя контейнеру, что необходимо создать новый экземпляр).Вы можете просто создать подкласс ContainerControlledLifetimeManager и переопределить этот метод.
Я в значительной степени написал его.Я полагаю, я мог бы дать вам код.:)
public class ContainerTrackedTransientLifetimeManager :
ContainerControlledLifetimeManager
{
protected override object SynchronizedGetValue()
{
return null;
}
}
Это должно работать.Я не проверял это ... из интерфейса, похоже, что оно разработано для отношения 1: 1 LifetimeManager к объекту, но если окажется, что оно больше, вам, возможно, придется переопределить SetValue (добавляет в коллекциюобъектов) и распоряжаться (располагает этой коллекцией объектов).Вот эта реализация:
public class ContainerTrackedTransientLifetimeManager :
SynchronizedLifetimeManager, IDisposable
{
private ConcurrentCollection<object> values = new ConcurrentCollection<object>();
protected override object SynchronizedGetValue()
{
return null;
}
protected override void SynchronizedSetValue(object newValue)
{
values.Add(newValue);
}
public override void RemoveValue()
{
Dispose();
}
public void Dispose()
{
Dispose(true);
GC.SuppressFinalize(this);
}
protected void Dispose(bool disposing)
{
var disposables = values.OfType<IDisposable>();
foreach(var disposable in disposables)
{
disposable.Dispose();
}
values.Clear();
}
Я не уверен, какой из этих ответов правильный.Дайте мне знать, как у вас дела.