Это старый вопрос, но некоторые ответы вводят в заблуждение, поэтому я приведу свой собственный.
Вы не можете сделать это с Unity. Конец истории.
Вызов RemoveValue
для менеджеров продолжительности жизни при регистрации не приводит к отмене регистрации ( больше информации о пожизненных менеджерах ), и этот метод не предназначен для отмены регистрации чего-либо. Таким образом, окончательное поведение является неожиданным и не удобным. Конечно, RemoveValue
имеет еще меньше смысла, если вы регистрируете реализацию или фабричный метод, хотя вопрос заключается в отмене регистрации экземпляров.
Рассмотрим следующий фрагмент кода
public interface SomeInterface
{
int Foo { get; set; }
}
public class SomeImplementation: SomeInterface
{
public int Foo { get; set; }
}
static void Main(string[] args)
{
UnityContainer iocContainer = new UnityContainer();
string registerName = "instance";
//before any registration
Resolve<SomeInterface>(iocContainer, registerName);
iocContainer.RegisterInstance<SomeInterface>(registerName, new SomeImplementation());
//after registration
Resolve<SomeInterface>(iocContainer, registerName);
ClearValue<SomeInterface>(iocContainer, registerName);
//after clear value
Resolve<SomeInterface>(iocContainer, registerName);
}
private static void Resolve<T>(UnityContainer iocContainer,string name)
{
if (iocContainer.IsRegistered<T>(name))
iocContainer.Resolve<T>(name);
iocContainer.ResolveAll<T>();
}
private static void ClearValue<T>(UnityContainer iocContainer, string name)
{
foreach (var registration in iocContainer.Registrations.Where(p => p.RegisteredType == typeof(T)
&& p.Name==name))
{
registration.LifetimeManager.RemoveValue();
}
}
Если вы отладите его, вы увидите, что после вызова ClearValue
контейнер все еще говорит, что он зарегистрирован, но если вы попытаетесь разрешить этот экземпляр, он выдаст исключение. Что еще хуже, звонки на ResolveAll<T>
тоже не удастся.
Подводя итог, независимо от того, выполняете ли вы ClearValue
, оборачиваете свой экземпляр регистра другим IoC или пользовательским классом или предоставляете свой собственный LifeTimeManager, ResolveAll<T>
и IsRegistered<T>
не будут вести себя должным образом, и регистрация все еще будет там. Так что не пытайтесь, потому что это не сработает, и это вызовет проблемы в будущем.