在不同 类 上的控制台应用程序中使用 AutoFac 构造函数注入
Using AutoFac constructor injection in a console application on different classes
所以我觉得我在这里遗漏了一些东西,但我基本上是在制作一个将调用多个处理程序的控制台应用程序。
Program.cs
private static IContainer _container;
static void Main(string[] args)
{
_container = AutoFacBootstrapper.Init();
var _backupFactory = _container.Resolve<IBackupFactory>();
UserHandler.Init();
}
AutoFacBootstrapper.cs
public static IContainer Init()
{
var builder = new ContainerBuilder();
builder.RegisterType<BackupFactory>().As<IBackupFactory>();
return builder.Build();
}
看到这一切既美好又有趣,我可以在 Program.cs 中使用我的工厂,但是当我尝试在另一个 class 中使用我的工厂时(比方说 UserHandler.cs ),我的 _backupFactory
将保持为空(这是有道理的)。
UserHandler.cs
private static IBackupFactory _backupFactory;
public UserHandler(IBackupFactory backupFactory)
{
_backupFactory = backupFactory;
}
public static void Init(string[] subCommands)
{
var users = _backupFactory.GetFtpUsers();
}
我该如何解决这个问题,以便我可以在另一个 class 中使用构造函数注入,而只需要在启动时对其进行初始化?
_backupFactory
为空,因为从未调用 UserHandler
构造函数。
要解决此问题,您还需要为 UserHandler
创建接口并在 AutoFacBootstrapper
.
中注册类型
interface IUserHandler
{
void PerformSomeAction();
}
class UserHandler : IUserHandler
{
private IBackupFactory _backupFactory;
public UserHandler(IBackupFactory backupFactory)
{
_backupFactory = backupFactory;
}
public void PerformSomeAction()
{
var users = _backupFactory.GetFtpUsers();
}
}
class AutoFacBootstrapper
{
public static IContainer Init()
{
var builder = new ContainerBuilder();
builder.RegisterType<UserHandler>().As<IUserHandler>();
builder.RegisterType<BackupFactory>().As<IBackupFactory>();
return builder.Build();
}
}
剩下的就是让 Autofac 解析 Main
方法中的 IUserHandler
类型。
static void Main(string[] args)
{
IContainer container = AutoFacBootstrapper.Init();
IUserHandler startPoint = container.Resolve<IUserHandler>();
startPoint.PerformSomeAction();
}
附带说明一下,随着应用程序变得越来越大,并且将创建新的项目,在 AutoFacBootstrap
class 中注册所有类型的应用程序并不表示。
最好在每个将继承 Autofac.Module
的项目中有一个单独的 class,这将覆盖 Load
方法。这样您就可以访问 ContainerBuilder
并能够注册所有需要的类型(来自该程序集)。
查看 Autofac 文档中的 Modules 部分了解更多详细信息
所以我觉得我在这里遗漏了一些东西,但我基本上是在制作一个将调用多个处理程序的控制台应用程序。
Program.cs
private static IContainer _container;
static void Main(string[] args)
{
_container = AutoFacBootstrapper.Init();
var _backupFactory = _container.Resolve<IBackupFactory>();
UserHandler.Init();
}
AutoFacBootstrapper.cs
public static IContainer Init()
{
var builder = new ContainerBuilder();
builder.RegisterType<BackupFactory>().As<IBackupFactory>();
return builder.Build();
}
看到这一切既美好又有趣,我可以在 Program.cs 中使用我的工厂,但是当我尝试在另一个 class 中使用我的工厂时(比方说 UserHandler.cs ),我的 _backupFactory
将保持为空(这是有道理的)。
UserHandler.cs
private static IBackupFactory _backupFactory;
public UserHandler(IBackupFactory backupFactory)
{
_backupFactory = backupFactory;
}
public static void Init(string[] subCommands)
{
var users = _backupFactory.GetFtpUsers();
}
我该如何解决这个问题,以便我可以在另一个 class 中使用构造函数注入,而只需要在启动时对其进行初始化?
_backupFactory
为空,因为从未调用 UserHandler
构造函数。
要解决此问题,您还需要为 UserHandler
创建接口并在 AutoFacBootstrapper
.
interface IUserHandler
{
void PerformSomeAction();
}
class UserHandler : IUserHandler
{
private IBackupFactory _backupFactory;
public UserHandler(IBackupFactory backupFactory)
{
_backupFactory = backupFactory;
}
public void PerformSomeAction()
{
var users = _backupFactory.GetFtpUsers();
}
}
class AutoFacBootstrapper
{
public static IContainer Init()
{
var builder = new ContainerBuilder();
builder.RegisterType<UserHandler>().As<IUserHandler>();
builder.RegisterType<BackupFactory>().As<IBackupFactory>();
return builder.Build();
}
}
剩下的就是让 Autofac 解析 Main
方法中的 IUserHandler
类型。
static void Main(string[] args)
{
IContainer container = AutoFacBootstrapper.Init();
IUserHandler startPoint = container.Resolve<IUserHandler>();
startPoint.PerformSomeAction();
}
附带说明一下,随着应用程序变得越来越大,并且将创建新的项目,在 AutoFacBootstrap
class 中注册所有类型的应用程序并不表示。
最好在每个将继承 Autofac.Module
的项目中有一个单独的 class,这将覆盖 Load
方法。这样您就可以访问 ContainerBuilder
并能够注册所有需要的类型(来自该程序集)。
查看 Autofac 文档中的 Modules 部分了解更多详细信息