【发布时间】:2020-08-06 13:41:38
【问题描述】:
我希望能够解析来自 Autofac 的服务集合,这些服务代表所有实现开放通用接口的注册类型。
public interface IEntityService<in T> where T : Entity
{
void DoEntityWork(T entity);
}
我有许多继承 Entity 的类和许多为该实体实现 IEntityService 的相应服务类。
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)
}
这是我使用 Autofac 注册它们的方式:
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]]
如何使用实现Entity 的类型参数解析所有实现IEntityService 的类型?
【问题讨论】:
-
有人已经提到了逆变,所以我将插话 Autofac 部分。我不相信 Autofac 支持解析所有类型的开放通用接口 (IEntityService)。您必须解析接口的封闭类型 (IEntityService
。如果您的用例允许,您可以考虑使用非泛型接口。然后您可以解析实现非泛型接口的所有类型的集合。跨度> -
@jandrew Guru Stron 也提到了使用非通用接口。自从提出建议以来,我一直在尝试这个想法,但尚未确定如何在保持特定类型使用的同时实现该想法。