Я не могу понять, как правильно использовать RegisterAllOpenGeneric
У меня есть эти простые определения:
public interface ISubscribeTo<T> { }
public class AnEventOf<T> { }
public interface IMarker { }
public class PocoB : IMarker { }
и обычный Subscriber
:
public class SubscribeToPocoB : ISubscribeTo<AnEventOf<PocoB>>
{
}
который зарегистрирован с этим кодом:
private void RegisterSubscribers(Container container)
{
var implementations = new List<Type>();
container.RegisterManyForOpenGeneric(typeof(ISubscribeTo<>),
AccessibilityOption.PublicTypesOnly,
(serviceType, implTypes) =>
{
container.RegisterAll(serviceType, implTypes);
implementations.AddRange(implTypes);
},
AppDomain.CurrentDomain.GetAssemblies()
);
implementations
.Distinct()
.ToList()
.ForEach(type => container.Register(type));
container.Verify();
}
и возвращается при вызове:
var registrations = container
.GetAllInstances<ISubscribeTo<AnEventOf<PocoB>>>();
Пока все хорошо.
PocoB
также реализует интерфейс IMarker
, и я пытаюсь создать связь с Subscriber
по AnEventOf<IMarker>>
, которая также будет возвращена при вызове GetAllInstances<ISubscribeTo<AnEventOf<PocoB>>>();
.
Я пробовал 3 разных определения:
public class SubscribeToIMarker1<TMarker> : ISubscribeTo<AnEventOf<TMarker>>
where TMarker : IMarker
{
}
public class SubscribeToIMarker2<TAnEventOf> : ISubscribeTo<TAnEventOf>
where TAnEventOf : AnEventOf<IMarker>
{
}
public class SubscribeToIMarker3<TMarker> : ISubscribeTo<TMarker>
where TMarker : IMarker
{
}
Вот различные методы тестирования, которые я написал - ни один из тестов не работает, все они возвращают только SubscribeToPocoB
:
[Test]
public void GetAllInstances_PocoB1_ReturnTwoRegistrations()
{
Container container = new Container();
container.RegisterAllOpenGeneric(
typeof(ISubscribeTo<>),
typeof(SubscribeToIMarker1<>));
RegisterSubscribers(container);
var registrations = container
.GetAllInstances<ISubscribeTo<AnEventOf<PocoB>>>();
Assert
.That(registrations.Count(),
Is.EqualTo(2));
}
[Test]
public void GetAllInstances_PocoB2_ReturnTwoRegistrations()
{
Container container = new Container();
container.RegisterAllOpenGeneric(
typeof(ISubscribeTo<>),
typeof(SubscribeToIMarker2<>));
RegisterSubscribers(container);
var registrations = container
.GetAllInstances<ISubscribeTo<AnEventOf<PocoB>>>();
Assert
.That(registrations.Count(),
Is.EqualTo(2));
}
[Test]
public void GetAllInstances_PocoB3_ReturnTwoRegistrations()
{
Container container = new Container();
container.RegisterAllOpenGeneric(
typeof(ISubscribeTo<>),
typeof(SubscribeToIMarker3<>));
RegisterSubscribers(container);
var registrations = container
.GetAllInstances<ISubscribeTo<AnEventOf<PocoB>>>();
Assert
.That(registrations.Count(),
Is.EqualTo(2));
}
Нужно ли мне делать больше, чтобы правильно зарегистрировать все открытые дженерики (например, SubscribeToIMarker1
)?
container.RegisterAllOpenGeneric(
typeof(ISubscribeTo<>),
typeof(SubscribeToIMarker1<>));