没有构造函数的 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
的依赖项,并会自动注入它。这称为自动接线。
我已经用 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
的依赖项,并会自动注入它。这称为自动接线。