遵循教程后的 AutoFac.Core.DependencyResolutionException

cle*_*tie 6 c# autofac

Autofac 的新手,遵循了 Youtube 上的教程(收视率很高),但它抛出了一个异常,不知道为什么。

例外:

DependencyResolutionException:激活特定注册期间发生错误。有关详细信息,请参阅内部异常。注册:Activator = IDomainRepository (ReflectionActivator),Services = [Solution.Entities.IDomainRepository],Lifetime = Autofac.Core.Lifetime.CurrentScopeLifetime,Sharing = None,Ownership = OwnedByLifetimeScope

NoConstructorsFoundException:找不到类型“Solution.Entities.IDomainRepository”的可访问构造函数。

IDomainRepository

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

    string Insert(Domain obj);

    bool Update(Domain obj);

    bool Delete(string URL);
}
Run Code Online (Sandbox Code Playgroud)

域存储库

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;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

域处理程序

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;
    }
Run Code Online (Sandbox Code Playgroud)

任何人都知道可能导致此错误的原因是什么?阅读有关忘记在界面上设置公共访问权限的信息,但这不是这里的问题..:/

Eri*_*ips 7

任何人都知道可能导致此错误的原因是什么?

builder.RegisterType<IDomainRepository>().As<IDomainRepository>();
                     ^^
Run Code Online (Sandbox Code Playgroud)

应该

builder.RegisterType<DomainRepository>().As<IDomainRepository>();
                     ^
Run Code Online (Sandbox Code Playgroud)

因为您需要RegisterTypeConcrete 类型,而不是接口。

Autofac注册概念

摘抄:

您注册的任何组件类型都RegisterType必须是具体类型。


ihe*_*heb 5

我知道问题已经解决了。但我有同样的错误,而且它来自不同的来源。

我注册的类有一个构造函数,其中注入了服务。该服务未注册。

所有依赖链都需要注册。