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.
@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!
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>();
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
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With