繁体   English   中英

解决 Autofac 中实现通用接口的所有类型的 IEnumerable

[英]Resolve IEnumerable of All Types that Implement Generic Interface in Autofac

我希望能够从 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的所有类型?

这就是逆变在 C# 中的工作方式, EntityAService不是IEntityService<Entity> ,这种关系以另一种方式工作:

public class EntityService : IEntityService<Entity>
{
    public void DoEntityWork(Entity entity) { }
}

IEntityService<EntityA> x = new EntityService();

一种解决方法是引入IEntityService的非通用版本,将所有实体服务注册为该版本并解析IEnumerable<IEntityService>

Autofac 不支持这种开箱即用的东西。 有一个ContravariantRegistrationSource但它确实与此相反 - 如果您注册IEntityService<Entity>然后解析IEntityService<EntityA>它将为您解析IEntityService<Entity>实例。 它不允许您解析IEnumerable<IEntityService<Entity>>并定位所有派生类型。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM