类型' ***'不能转让给服务' ***'在Autofac中

时间:2014-04-28 01:15:06

标签: c# autofac

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

界面:

public interface IDynamicQuery
{
    IQueryable<T> CreateDynamicQuery<T>(string propertyName, string propertyValue, Expression<Func<T, bool>> where) where T:class;
}

班级:

public class DynamicQuery :IDynamicQuery
{
    public DynamicQuery(IUnitOfWork unitOfWork)
    {
        this.unitOfWork = unitOfWork;
    }
    private  readonly IUnitOfWork unitOfWork;

    public IQueryable<T> CreateDynamicQuery<T>(string propertyName, string propertyValue, Expression<Func<T, bool>> where) where T:class
    {
        var appRepository = unitOfWork.Repository<T>();

        IQueryable<T> queryResult = null;
        if (propertyName.Contains('$'))  
            propertyName = propertyName.Replace('$', '.');
        queryResult = appRepository.GetMany(where).Where("" + propertyName + ".Contains(\"" + propertyValue + "\")");
        return queryResult;
    }
}

然后我在应用程序开始条目中注册它们:

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

但是当我基于MVC 4启动我的项目时,它会抛出一个例外:

 The type 'TinyFrame.Framework.Query.IDynamicQuery' is not assignable to service 'TinyFrame.Framework.Query.DynamicQuery'.

Exception抛出:var container = builder.Build();

我知道如何在autofac中注册一个泛型类,但我不知道如何注册我上面提到的类,任何人都可以帮助我吗?我是autofac的新来者,请咨询。

6 个答案:

答案 0 :(得分:27)

@CharlieShi我有同样的问题,我注意到我忘记了为我的班级添加继承。但在你的情况下,试试这个:

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

反转与班级的接口!

答案 1 :(得分:6)

就我而言,我已经颠倒了接口和类的提及顺序:

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

答案 2 :(得分:0)

您可以像这样使用autofac容器注册完整程序集

 builder.RegisterAssemblyTypes(
            typeof(YourClass).Assembly)
            .AsImplementedInterfaces()
            .InstancePerLifetimeScope();

在您的情况下,如果您只想注册特定类型,请使用以下内容:

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

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

答案 3 :(得分:0)

您的问题是您尝试在实现上映射接口,只需交换IDynamicQuery和DynamicQuery。并且不要忘记进行重建。

应该是这样的:

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

答案 4 :(得分:0)

遇到同样的问题,但原因在我的情况下有所不同。我没有看到我两次注册同一类型。我发现此错误消息具有误导性。

答案 5 :(得分:0)

如果您忘记将界面添加到班级,可以这样做。

builder.RegisterType<People>().As<IPeople>();

这将导致错误

public class People

这将解决它

public class People : IPeople