Тип «***» не может быть назначен службе «***» в 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
@ Арон Боже мой, как же я небрежен..... Я плохо спал прошлой ночью. Спасибо за совет.   -  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