遵循本教程后的AutoFac.Core.DependencyResolutionException

时间:2018-12-31 21:57:30

标签: c# autofac

Autofac的新手,跟随了YouTube上的教程(获得了很高的评价),但是它抛出了异常,不知道为什么。

例外:

  

DependencyResolutionException:在激活特定注册期间发生错误。有关详细信息,请参见内部异常。注册:激活程序= IDomainRepository(ReflectionActivator),服务= [Solution.Entities.IDomainRepository],生命周期= Autofac.Core.Lifetime.CurrentScopeLifetime,共享=无,所有权= OwnedByLifetimeScope

  

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

IDomain存储库

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;
    }

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

2 个答案:

答案 0 :(得分:1)

  

有人知道什么可能导致此错误吗?

tvScrollBar.valueProperty().addListener((observable, oldValue, newValue) -> {
    if ((Double) newValue == 1.0) {
        System.out.println("Bottom!");
    }
});

应该是

import javafx.application.Application;
import javafx.application.Platform;
import javafx.beans.property.SimpleStringProperty;
import javafx.geometry.Insets;
import javafx.geometry.Pos;
import javafx.scene.Scene;
import javafx.scene.control.ScrollBar;
import javafx.scene.control.TableColumn;
import javafx.scene.control.TableView;
import javafx.scene.layout.VBox;
import javafx.stage.Stage;

public class ScrollBarNotify extends Application {

    public static void main(String[] args) {
        launch(args);
    }

    @Override
    public void start(Stage primaryStage) {

        // Simple interface
        VBox root = new VBox(5);
        root.setPadding(new Insets(10));
        root.setAlignment(Pos.CENTER);

        // Simple TableView to demonstrate
        TableView<String> tableView = new TableView<>();
        TableColumn<String, String> column = new TableColumn<>("Text");
        column.setCellValueFactory(f -> new SimpleStringProperty(f.getValue()));

        tableView.getColumns().add(column);

        // Add some sample items to our TableView
        for (int i = 0; i < 100; i++) {
            tableView.getItems().add("Item #" + i);
        }

        // Now, let's add a listener to the TableView's scrollbar. We can only access the ScrollBar after the Scene is
        // rendered, so we need to do schedule this to run later.
        Platform.runLater(() -> {
            ScrollBar tvScrollBar = (ScrollBar) tableView.lookup(".scroll-bar:vertical");
            tvScrollBar.valueProperty().addListener((observable, oldValue, newValue) -> {
                if ((Double) newValue == 1.0) {
                    System.out.println("Bottom!");
                }
            });

        });

        // Finally, add the TableViewto our layout
        root.getChildren().add(tableView);

        // Show the Stage
        primaryStage.setWidth(300);
        primaryStage.setHeight(300);
        primaryStage.setScene(new Scene(root));
        primaryStage.show();
    }
}

因为您需要builder.RegisterType<IDomainRepository>().As<IDomainRepository>(); ^^ 的具体类型,而不是接口。

Autofac Registration Concepts

节选:

  

您通过builder.RegisterType<DomainRepository>().As<IDomainRepository>(); ^ 注册的任何组件类型都必须是具体类型。

答案 1 :(得分:0)

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

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

所有依赖项链都需要注册。