Типът „***“ не може да бъде присвоен на услуга „***“ в 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, благодаря за съвет.


person CharlieShi    schedule 28.04.2014    source източник
comment
Имате го по грешен начин. IDynamicQuery не е DynamicQuery, но DynamicQuery Е IDynamicQuery.   -  person Aron    schedule 28.04.2014
comment
@Aron О, боже, колко небрежно от моя страна..... Имах лош сън снощи. Thx за съвет.   -  person CharlieShi    schedule 28.04.2014


Отговори (6)


@CharlieShi Имах същия проблем и забелязах, че забравям да добавя наследяване към моя клас. Но във вашия случай опитайте това:

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

обърнете интерфейса с класа!

person Alisom Martins    schedule 23.12.2014
comment
ох Бях забравил да добавя интерфейса и към моя клас. Петък е, така че това е моето извинение. - person RichS; 04.05.2018
comment
@RichS хахаха, случва се, момче! - person Alisom Martins; 04.05.2018
comment
ТАЗИ част от вашия коментар наистина ми помогна!! --› Забравих да добавя наследство - person Missy; 10.12.2019

В моя случай бях обърнал реда, в който интерфейсът и класовете трябва да бъдат споменати:

builder.RegisterType<CONCRETE_CLASS>().As<INTERFACE>();
person Sheena Agrawal    schedule 19.06.2017

Това може да стане, ако забравите да добавите интерфейса към вашия клас.

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

Това ще причини грешката

public class People

Това ще го разреши

public class People : IPeople 
person MyDaftQuestions    schedule 30.04.2018
comment
Това беше моят проблем - person Dino; 07.07.2020
comment
Благодаря ти! Това беше моят проблем. Странно е как можеш да пропускаш такива малки неща. - person Jonathon Cowley-Thom; 14.05.2021

Можете да регистрирате пълното сглобяване с контейнера autofac по следния начин:

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

Във вашия случай, ако искате да регистрирате само пертикуларен тип, просто използвайте следното:

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

Можете да зададете живота според вашите бизнес изисквания.

person error_handler    schedule 01.04.2016

Вашият проблем е, че се опитвате да картографирате интерфейс при внедряване, просто разменете IDynamicQuery и DynamicQuery. И не забравяйте да направите реконструкция.

Трябва да е като:

builder.RegisterType<DynamicQuery>().As<IDynamicQuery>().InstancePerHttpRequest();
person Denis Kotenko    schedule 03.02.2017

Срещнах същия проблем, но причината беше различна в моя случай. Не видях да регистрирам един и същи тип два пъти. Смятам, че това съобщение за грешка е подвеждащо.

person j.e.    schedule 02.03.2018