C# 解析在Autofac中实现泛型接口的所有类型的IEnumerable

C# 解析在Autofac中实现泛型接口的所有类型的IEnumerable,c#,.net-core,autofac,C#,.net Core,Autofac,我希望能够解析来自Autofac的服务集合,该集合表示实现开放泛型接口的所有注册类型 public interface IEntityService<in T> where T : Entity { void DoEntityWork(T entity); } 以下是我如何向Autofac注册它们: builder.RegisterType<EntityAService>().As<IEntityService<EntityA>(); buil

我希望能够解析来自Autofac的服务集合,该集合表示实现开放泛型接口的所有注册类型

public interface IEntityService<in T> where T : Entity
{
    void DoEntityWork(T entity);
}
以下是我如何向Autofac注册它们:

builder.RegisterType<EntityAService>().As<IEntityService<EntityA>();
builder.RegisterType<EntityBService>().As<IEntityService<EntityB>();
builder.RegisterType<EntityCService>().As<IEntityService<EntityC>();
我尝试将它们全部注册为()

The type 'MyProject.Services.EntityAService' is not assignable to service 'MyProject.Interfaces.IEntityService'1[[MyProject.Models.Entity]]
如何使用实现
实体
的类型参数解析所有实现
IEntityService
的类型?

这就是C中的工作方式,
实体服务
不是
IEntityService
,这种关系的工作方式是另一种:

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

IEntityService<EntityA> x = new EntityService();
公共类EntityService:EntityService
{
公共无效实体工作(实体){}
}
IEntityService x=新实体服务();
一种解决方法是引入一个非通用版本的
IEnityService
,将您的所有实体服务注册为该版本,并解决
IEnumerable
这是如何在C中工作的,
EntityAService
不是
IEnityService
,这种关系以另一种方式工作:

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

IEntityService<EntityA> x = new EntityService();
公共类EntityService:EntityService
{
公共无效实体工作(实体){}
}
IEntityService x=新实体服务();

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

Autofac不支持这种开箱即用的服务。有一种方法,但它与此相反-如果您注册
IEntityService
,然后解析
IEntityService
,它将为您解析
IEntityService
实例。它不允许您解析
IEnumerable
并定位所有派生类型。

Autofac不支持这种开箱即用的功能。有一种方法,但它与此相反-如果您注册
IEntityService
,然后解析
IEntityService
,它将为您解析
IEntityService
实例。它不允许您解析
IEnumerable
并查找所有派生类型。

我对软件开发还比较陌生,请原谅我的无知。。。我使用
IEntityService,其中T:Entity
的目的是强制实现者指定类将处理的特定
Entity
类型,然后在实现中只能对该特定
Entity
类型进行操作。非泛型的
IEntityService
只允许我将每个成员限制为
实体
,而不是更派生的类型。我想得不对吗?我确信有更好的方法来完成我想要完成的任务。@draconastar是的,你想得对。这个想法是服务应该实现两个接口-通用的用于单个接口,非通用的用于
IEnumerable
IEntityService
在这个上下文中可以替换为非通用版本)。我非常感谢您在这里的输入!我想我明白了。如果我要创建一个非通用的
IEntityService
接口,那么我可以实现这两个接口并将其作为一个集合检索。我这里的问题是,既然我将非泛型接口方法检索为非泛型接口,那么我是否只限于调用非泛型接口方法?我确实需要对通用接口成员的特定访问权限,以便以不同的方式处理每个实体。@draconastar您试图通过解析一组服务来实现什么?如果需要使用泛型接口,只需单独解析每个闭合类型就更有意义了。i、 e.
IEntityService
IEntityService
等)。@jandew在实践中,我有大约30种
实体
类型。目前,我完全按照你说的做,并逐一解决每个问题,但它们被注入的类有30个字段,30个构造函数参数,等等。我希望能够清理它。我对软件开发还比较陌生,所以请原谅我的无知。。。我使用
IEntityService,其中T:Entity
的目的是强制实现者指定类将处理的特定
Entity
类型,然后在实现中只能对该特定
Entity
类型进行操作。非泛型的
IEntityService
只允许我将每个成员限制为
实体
,而不是更派生的类型。我想得不对吗?我确信有更好的方法来完成我想要完成的任务。@draconastar是的,你想得对。这个想法是服务应该实现两个接口-通用的用于单个接口,非通用的用于
IEnumerable
IEntityService
在这个上下文中可以替换为非通用版本)。我非常感谢您在这里的输入!我想我明白了。如果我要创建一个非通用的
IEntityService
接口,那么我可以实现这两个接口并将其作为一个集合检索。我这里的问题是,既然我将非泛型接口方法检索为非泛型接口,那么我是否只限于调用非泛型接口方法?我确实需要对通用接口成员的特定访问权限,以便以不同的方式处理每个实体。@draconastar您试图通过解析一组服务来实现什么?如果需要使用泛型接口,只需单独解析每个闭合类型就更有意义了。i、 e.
IEntityService
IEntityService
等)。@jandew在实践中,我有大约30种
实体
类型。目前我完全按照你说的做,并逐一解决,但它们被注入的类有30个字段,30个构造函数参数,等等。我希望能够清除其中一个已经提到的矛盾,所以我只想插话
public class EntityService : IEntityService<Entity>
{
    public void DoEntityWork(Entity entity) { }
}

IEntityService<EntityA> x = new EntityService();