【问题标题】:The type '***' is not assignable to service '***' in Autofac'***' 类型不能分配给 Autofac 中的服务 '***'
【发布时间】:2014-04-28 01:15:05
【问题描述】:

我现在正在使用 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'.

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

我知道如何在 autofac 中注册一个泛型类,但我不知道如何注册我提出的上述类,任何人都可以帮助我吗?我是 autofac 的新手,请多多指教。

【问题讨论】:

  • 你弄错了。 IDynamicQuery 不是 DynamicQuery 而是 DynamicQueryIDynamicQuery
  • @Aron 天哪,我真是太粗心了……我昨晚睡得不好。谢谢你的建议。

标签: c# autofac


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

    如果您忘记将接口添加到您的类,可以这样做。

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

    这会导致错误

    public class People
    

    这样就解决了

    public class People : IPeople 
    

    【讨论】:

    • 这是我的问题
    • 谢谢!这是我的问题。你怎么能错过这样的小事,这很有趣。
    【解决方案3】:

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

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

    用类反转接口!

    【讨论】:

    • 哦。我也忘记将接口添加到我的课程中。今天是星期五,所以这是我的借口。
    • @RichS 哈哈哈,真的发生了!
    • 你的这部分评论真的帮助了我!! --> 我忘记添加继承
    【解决方案4】:

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

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

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

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

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

    【讨论】:

      【解决方案5】:

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

      应该是这样的:

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

      【讨论】:

        【解决方案6】:

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

        【讨论】:

          猜你喜欢
          • 2014-09-14
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-07-02
          • 1970-01-01
          • 1970-01-01
          • 2022-01-27
          • 2016-07-31
          相关资源
          最近更新 更多