AutoFac.Core.DependencyResolutionException после следующего урока - PullRequest
0 голосов
/ 01 января 2019

Новичок в Autofac, следовал учебнику на Youtube (с отличными оценками), но выдает исключение, не знаю почему.

Исключения:

DependencyResolutionException: ошибка произошла во времяактивация определенной регистрации.Смотрите внутреннее исключение для деталей.Регистрация: Activator = IDomainRepository (ReflectionActivator), Службы = [Solution.Entities.IDomainRepository], Lifetime = Autofac.Core.Lifetime.CurrentScopeLifetime, Совместное использование = Нет, Владение = OwnedByLifetimeScope

И

1010 *

NoConstructorsFoundException: не найдены доступные конструкторы для типа 'Solution.Entities.IDomainRepository'.

IDomainRepository

public interface IDomainRepository
{
    List<Domain> GetAll();

    string Insert(Domain obj);

    bool Update(Domain obj);

    bool Delete(string URL);
}

DomainRepository

public class DomainRepository : IDomainRepository
{
    public List<Domain> GetAll()
    {
        using (IDbConnection db = new SqlConnection(Helper.ConnectionString))
        {
            if (db.State == ConnectionState.Closed)
            {
                db.Open();
            }
            return db.Query<Domain>("SELECT * FROM Domains", commandType: CommandType.Text).ToList();

        }
    }

    public string Insert(Domain obj)
    {
        using (IDbConnection db = new SqlConnection(Helper.ConnectionString))
        {
            if (db.State == ConnectionState.Closed)
            {
                db.Open();
            }
            db.Query<Domain>("INSERT INTO Domains (Domain) VALUES ("+obj.URL+")", commandType: CommandType.Text);
            return obj.URL;

        }
    }

    public bool Update(Domain obj)
    {
        using (IDbConnection db = new SqlConnection(Helper.ConnectionString))
        {
            if (db.State == ConnectionState.Closed)
            {
                db.Open();
            }
            int result = db.Execute("UPDATE Domains SET Domain="+obj.URL+" WHERE Domain="+obj.URL+")", commandType: CommandType.Text);
            return result != 0;

        }
    }

    public bool Delete(string URL)
    {
        using (IDbConnection db = new SqlConnection(Helper.ConnectionString))
        {
            if (db.State == ConnectionState.Closed)
            {
                db.Open();
            }
            int result = db.Execute("delete from Domains where Domain = @Url", new { Url = URL }, commandType: CommandType.Text);
            return result != 0;
        }
    }
}

DomainHandler

static Autofac.IContainer _container;

    static DomainHandler()
    {
        ContainerBuilder builder = new ContainerBuilder();
        builder.RegisterType<IDomainRepository>().As<IDomainRepository>();
        _container = builder.Build();
    }

    public static bool Delete(string Url)
    {
        return _container.Resolve<IDomainRepository>().Delete(Url);
    }

    public static List<Domain> GetAll()
    {
        return _container.Resolve<IDomainRepository>().GetAll();
    }

    public static Domain Save(Domain obj, EntityState state)
    {
        if (state == EntityState.Added)
            obj.URL = _container.Resolve<IDomainRepository>().Insert(obj);
        else
            _container.Resolve<IDomainRepository>().Update(obj);

        return obj;
    }

Кто-нибудь знает, что может быть причиной этой ошибки?Прочитайте о том, что вы забыли установить публичный доступ к интерфейсу, но это не проблема здесь ..: /

1 Ответ

0 голосов
/ 01 января 2019

Кто-нибудь знает, что может быть причиной этой ошибки?

builder.RegisterType<IDomainRepository>().As<IDomainRepository>();
                     ^^

должно быть

builder.RegisterType<DomainRepository>().As<IDomainRepository>();
                     ^

, потому что вам нужно RegisterType типа Бетон,не интерфейс.

Концепции регистрации Autofac

Выдержка:

Любой тип компонента, который вы регистрируете через RegisterType, должен быть конкретным типом.

...