web-dev-qa-db-ja.com

タイプ '***'はAutofacのサービス '***'に割り当てることができません

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の新人です。

16
CharlieShi

@CharlieShi同じ問題があり、クラスに継承を追加するのを忘れていることに気付きました。しかし、あなたの場合、これを試してください:

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

クラスとのインターフェースを逆にします!

36
Alisom Martins

私の場合、インターフェースとクラスが言及される順序を逆にしました:

builder.RegisterType<CONCRETE_CLASS>().As<INTERFACE>();
7
Sheena Agrawal

次のように、autofacコンテナにcomplete Assemblyを登録できます。

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

あなたの場合、perticular typeのみを登録したい場合は、次のようにしてください:

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

ビジネス要件に従ってライフタイムを設定できます。

0
error_handler

同じ問題が発生しましたが、私の場合は原因が異なりました。同じタイプを2回登録していることがわかりませんでした。このエラーメッセージは誤解を招くものです。

0
j.e.

あなたの問題は、インターフェイスを実装にマップしようとすることです。IDynamicQueryとDynamicQueryを交換するだけです。そして、再構築を行うことを忘れないでください。

それは次のようになります:

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

これは、インターフェイスをクラスに追加し忘れた場合に実行できます。

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

これによりエラーが発生します

public class People

これで解決します

public class People : IPeople 
0
MyDaftQuestions