Я нашел хороший пост: Singleton WCF Proxy .
Речь идет о реализации области жизни прокси WCF с использованием Castle Windsor DI контейнера.
Реализация абстрактного класса AbstractLifestyleManager
из Castle.MicroKernel.Lifestyle
пространства имен переопределяет 3 метода: Resolve
, Dispose
и Release
. В методе Release
у нас есть доступ к контексту , из которого мы можем разрешить экземпляр службы.
Я скопировал код из этого поста (с небольшим изменением) ниже:
public class SingletonWCFProxyLifestyleManager : AbstractLifestyleManager
{
private object instance;
public override object Resolve(Castle.MicroKernel.CreationContext context)
{
lock (base.ComponentActivator)
{
if (this.instance == null)
{
this.instance = base.Resolve(context);
}
else
{
ICommunicationObject communicationObject = this.instance as ICommunicationObject;
if (communicationObject != null &&
communicationObject.State == CommunicationState.Faulted)
{
try
{
communicationObject.Abort();
}
catch { }
this.instance = base.Resolve(context);
}
}
}
return this.instance;
}
public override void Dispose()
{
if (this.instance != null)
{
base.Release(this.instance);
}
}
public override void Release(object instance)
{
}
}
Я бы хотел предоставить такую же функциональность, используя контейнер Unity . Похоже, класс LifetimeManager
из пространства имен Microsoft.Practices.Unity
(и, опционально, интерфейс IRequiresRecovery
) предназначен для этого.
Все методы, которые предоставляет класс, показаны ниже:
public class SingletonWCFProxyLifestyleManager : LifetimeManager, IRequiresRecovery
{
public override object GetValue()
{
throw new NotImplementedException();
}
public override void RemoveValue()
{
throw new NotImplementedException();
}
public override void SetValue(object newValue)
{
throw new NotImplementedException();
}
#region IRequiresRecovery Members
public void Recover()
{
throw new NotImplementedException();
}
#endregion
}
А вот и вопрос:
Как обеспечить ту же функциональность во втором примере (с использованием Unity), как это было сделано в первом примере (с использованием Castle Windsor)?
(PS: нет доступа к контексту контейнера, так как я могу разрешить объект?).
Привет