C# 类型'***';不可分配给服务'***';在Autofac中

C# 类型'***';不可分配给服务'***';在Autofac中,c#,autofac,C#,Autofac,我现在使用System.Linq.dynamic在我的项目中进行动态查询。我使用Autofac作为默认的IOC容器。但现在我在注册通用组件时遇到了一个问题,下面是我的代码: 界面: public interface IDynamicQuery { IQueryable<T> CreateDynamicQuery<T>(string propertyName, string propertyValue, Expression<Func<T, bool&g

我现在使用System.Linq.dynamic在我的项目中进行动态查询。我使用Autofac作为默认的IOC容器。但现在我在注册通用组件时遇到了一个问题,下面是我的代码:

界面:

public interface IDynamicQuery
{
    IQueryable<T> CreateDynamicQuery<T>(string propertyName, string propertyValue, Expression<Func<T, bool>> where) where T:class;
}
异常在以下位置引发:
var container=builder.Build()


我知道如何在autofac中注册泛型类,但我不知道如何在我提出的类之上注册,有人能帮我吗?我是autofac的新成员,建议中的thx。

@CharlieShi我也有同样的问题,我注意到我忘了将继承添加到我的类中。但在您的情况下,请尝试以下方法:

builder.RegisterType();

用类反转接口

您可以通过以下方式使用autofac容器注册完整组件

 builder.RegisterAssemblyTypes(
            typeof(YourClass).Assembly)
            .AsImplementedInterfaces()
            .InstancePerLifetimeScope();
在您的情况下,如果只想注册特定类型,则只需使用以下命令:

builder.RegisterType<DynamicQuery>()
             .As<IDynamicQuery>()
             .InstancePerLifetimeScope();
builder.RegisterType()
.As()
.InstancePerLifetimeScope();

您可以根据业务需求设置生存期。

您的问题是,您试图在实现上映射接口,只需交换IDynamicQuery和DynamicQuery即可。别忘了重建

应该是这样的:

builder.RegisterType<DynamicQuery>().As<IDynamicQuery>().InstancePerHttpRequest();
builder.RegisterType();

在我的例子中,我颠倒了接口和类的提及顺序:

builder.RegisterType<CONCRETE_CLASS>().As<INTERFACE>();
builder.RegisterType().As();

遇到了相同的问题,但在我的案例中原因不同。我没有发现我注册了两次相同的类型。我发现此错误消息具有误导性。

如果忘记将接口添加到类中,则可以执行此操作

builder.RegisterType<People>().As<IPeople>();
这将解决它

public class People : IPeople 

你走错方向了。
IDynamicQuery
不是
DynamicQuery
,而是
DynamicQuery
IDynamicQuery
。@Aron天哪,我真粗心。。。。。我昨晚睡得不好。谢谢你的建议。我也忘了给我的类添加接口。今天是星期五,所以这是我的借口。@RichS哈哈哈,这是碰巧的家伙!你的这部分评论真的帮助了我!!-->我忘了加遗产这是我的问题谢谢!这是我的问题。你怎么会错过这样的小事,真有趣。
builder.RegisterType<CONCRETE_CLASS>().As<INTERFACE>();
builder.RegisterType<People>().As<IPeople>();
public class People
public class People : IPeople