我现在正在使用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的新来者,请咨询。
答案 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