没有构造函数的 Autofac 注册类型

Autofac Register Type without constructor

我已经用 Autofac 注册了一个类型,但是接口总是 null。我不知道我的实现是否正确。在下面的代码中 _dbFactory 总是 null。请指导。

class图书馆

 public class DatabaseHelper
{
    private IDatabaseFactory _dbFactory;

    public void ExecuteQuery()
    {
        using (var cmd = _dbFactory.CreateCommand())
        {
            cmd.CommandType = CommandType.Text;
            cmd.CommandText = "Select *  from Employee";
            cmd.ExecuteNonQuery();
        }
    }
}

我的控制台应用程序

static void Main(string[] args)
    {
        UpdateDependency();

        var dbHelper = new DatabaseHelper();

        dbHelper.ExecuteQuery();

        Console.Read();
    }

    public static void UpdateDependency()
    {
        var builder = new ContainerBuilder();

        builder.Register(c => new SqlFactory("Data Source=TEST;Initial Catalog=test;Integrated Security=True")).As<IDatabaseFactory>();

        var container = builder.Build();

        container.Resolve<IDatabaseFactory>();

        using (var scope = container.BeginLifetimeScope())
        {
            var app = scope.Resolve<IDatabaseFactory>();
        }
    }

像这样使用构造函数注入:

public class DatabaseHelper
{
    private IDatabaseFactory _dbFactory;

    public DatabaseHelper(IDatabaseFactory factory)
    {
        _dbFactory = factory;
    }

    ....
}

然后让容器去解析DatabaseHelper而不是像这样手动构造它:

static void Main(string[] args)
{
    var builder = new ContainerBuilder();

    builder.Register(c => new SqlFactory("Data Source=TEST;Initial Catalog=test;Integrated Security=True")).As<IDatabaseFactory>();

    builder.RegisterType<DatabaseHelper>();

    var container = builder.Build();

    using (var scope = container.BeginLifetimeScope())
    {
        var dbHelper = scope.Resolve<DatabaseHelper>();

        dbHelper.ExecuteQuery();

        Console.Read();
    }
}

请注意,您不必解析 IDatabaseFactory,因为容器会自动检测到它是 DatabaseHelper 的依赖项,并会自动注入它。这称为自动接线。