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の新人です。
@CharlieShi同じ問題があり、クラスに継承を追加するのを忘れていることに気付きました。しかし、あなたの場合、これを試してください:
builder.RegisterType<DynamicQuery>().As<IDynamicQuery>().InstancePerHttpRequest();
クラスとのインターフェースを逆にします!
私の場合、インターフェースとクラスが言及される順序を逆にしました:
builder.RegisterType<CONCRETE_CLASS>().As<INTERFACE>();
次のように、autofacコンテナにcomplete Assemblyを登録できます。
builder.RegisterAssemblyTypes(
typeof(YourClass).Assembly)
.AsImplementedInterfaces()
.InstancePerLifetimeScope();
あなたの場合、perticular typeのみを登録したい場合は、次のようにしてください:
builder.RegisterType<DynamicQuery>()
.As<IDynamicQuery>()
.InstancePerLifetimeScope();
ビジネス要件に従ってライフタイムを設定できます。
同じ問題が発生しましたが、私の場合は原因が異なりました。同じタイプを2回登録していることがわかりませんでした。このエラーメッセージは誤解を招くものです。
あなたの問題は、インターフェイスを実装にマップしようとすることです。IDynamicQueryとDynamicQueryを交換するだけです。そして、再構築を行うことを忘れないでください。
それは次のようになります:
builder.RegisterType<DynamicQuery>().As<IDynamicQuery>().InstancePerHttpRequest();
これは、インターフェイスをクラスに追加し忘れた場合に実行できます。
builder.RegisterType<People>().As<IPeople>();
これによりエラーが発生します
public class People
これで解決します
public class People : IPeople