Я создаю универсальный локатор служб, но у меня проблема.У меня есть способ добавить или заменить услугу.Служба должна быть заменена, если в текущем списке услуг есть только 1 кандидат.
// IA - TestA
// IB - TestB
// IA/IB - TestAB
// <IB> TestAB
public static void AddOrReplaceService<T>(T serviceToAdd) where T: class
{
if (serviceToAdd == null)
throw new ArgumentNullException(nameof(serviceToAdd));
List<T> foundServices = new List<T>();
int index = -1;
for (int i = 0; i < _services.Count; i++)
{
if (!(_services[i] is T)
&& !_services[i].GetType().IsAssignableFrom(typeof(T))
&& !_services[i].GetType().IsInstanceOfType(serviceToAdd)
&& !serviceToAdd.GetType().IsInstanceOfType(_services[i]))
continue;
foundServices.Add((T) _services[i]);
if (index == -1)
index = i;
}
switch (foundServices.Count)
{
case 0:
AddService(serviceToAdd);
break;
case 1:
_services[index] = serviceToAdd;
return;
default:
throw new MultipleServicesAlreadyExistsException("Multiple services found with " + typeof(T).Name
+ foundServices.ToStringCollection(", "));
}
}
Для проверки моего локатора услуг у меня есть 2 интерфейса IA
и IB
и 3 класса, TestA : IA
, TestB : IB
и TestAB : IA, IB
Дело в том, что если в списке есть и 1011 *, и TestB
, и вы пытаетесь добавить TestAB
, это должно выдать исключение, поскольку оба TestA
и TestB
реализуют интерфейсы TestAB
.
Я попытался добавить кучу AssignableFrom
и т. Д. Логики.Тем не менее, я не могу заставить его работать.
Вот часть модульного теста
[Test]
public void Test()
{
try
{
ServiceLocator.Reset();
Assert.IsTrue(AddService<IA>(new TestA(), false));
Assert.IsTrue(AddService<IB>(new TestB(), false));
// TestAB implements IA and IB so replacing should fail;
Assert.IsTrue(AddOrReplaceService<IB>(new TestAB(), true));
Помощь будет принята с благодарностью!Заранее спасибо.