Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

The type '***' is not assignable to service '***' in Autofac

Tags:

c#

autofac

I am now doing a dynamic query in my project by using System.Linq.Dynamic. I use Autofac as my default IOC container. But Now I get a problem on registering generic components, here is my code :

the interface:

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

the 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;
    }
}

Then I register them in the application start entry:

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

But When I start up my project based on MVC 4, it throws me an exception like :

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

the Exception throws at : var container = builder.Build();

I know how to register a generic class in autofac, but I don't know how to register above class I raised, anyone can help me on this? I am a new comer to autofac, thx in advice.

like image 425
CharlieShi Avatar asked Apr 28 '14 01:04

CharlieShi


3 Answers

@CharlieShi I had the same problem and I noticed that I was forgetting to add inheritance to my class. But in your case, try this:

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

reverse the interface with the class!

like image 105
Alisom Martins Avatar answered Nov 04 '22 04:11

Alisom Martins


In my case, I had reversed the order in which the interface and the classes are to be mentioned:

builder.RegisterType<CONCRETE_CLASS>().As<INTERFACE>();
like image 43
Sheena Agrawal Avatar answered Nov 04 '22 04:11

Sheena Agrawal


This can be done if you forget to add the Interface to your class.

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

This will cause the error

public class People

This will resolve it

public class People : IPeople 
like image 6
MyDaftQuestions Avatar answered Nov 04 '22 05:11

MyDaftQuestions