Я хочу иметь возможность разрешить набор служб из Autofa c, который представляет все зарегистрированные типы, реализующие открытый интерфейс generi c.
public interface IEntityService<in T> where T : Entity
{
void DoEntityWork(T entity);
}
У меня много классов, наследующих Entity
и многие соответствующие классы обслуживания, которые реализуют IEntityService
для этой Entity.
public class EntityA : Entity { }
public class EntityB : Entity { }
public class EntityC : Entity { }
public class EntityAService : IEntityService<EntityA>
{
public void DoEntityWork(EntityA entity)
}
public class EntityBService : IEntityService<EntityB>
{
public void DoEntityWork(EntityB entity)
}
public class EntityCService : IEntityService<EntityC>
{
public void DoEntityWork(EntityB entity)
}
Вот как я регистрирую их в Autofa c:
builder.RegisterType<EntityAService>().As<IEntityService<EntityA>();
builder.RegisterType<EntityBService>().As<IEntityService<EntityB>();
builder.RegisterType<EntityCService>().As<IEntityService<EntityC>();
Что бы я хотелось бы иметь возможность разрешить каждую из этих IEntityService
регистраций в коллекции. Однако попытка ввести их с помощью следующего кода возвращает пустую коллекцию:
public class MyProcessingClass(IEnumerable<IEntityService<Entity>> entityServices)
{
_entityServices = entityServices;
}
Вместо этого я попытался зарегистрировать их все As<IEntityService<Entity>>()
, но это вызывает ArgumentException
со следующим сообщением:
The type 'MyProject.Services.EntityAService' is not assignable to service 'MyProject.Interfaces.IEntityService'1[[MyProject.Models.Entity]]
Как я могу разрешить все типы, реализующие IEntityService
, с аргументом типа, реализующим Entity
?