Jor*_*dec 4 c# autofac constructor-injection
所以我觉得我在这里遗漏了一些东西,但我基本上是在制作一个将调用多个处理程序的控制台应用程序。
程序.cs
private static IContainer _container;
static void Main(string[] args)
{
_container = AutoFacBootstrapper.Init();
var _backupFactory = _container.Resolve<IBackupFactory>();
UserHandler.Init();
}
Run Code Online (Sandbox Code Playgroud)
AutoFacBootstrapper.cs
public static IContainer Init()
{
var builder = new ContainerBuilder();
builder.RegisterType<BackupFactory>().As<IBackupFactory>();
return builder.Build();
}
Run Code Online (Sandbox Code Playgroud)
看到这一切既美好又有趣,我可以在 Program.cs 中使用我的工厂,但是当我尝试在不同的类中使用我的工厂时(比如 UserHandler.cs),我的_backupFactory将保持为 null(这是有道理的)。
用户处理程序
private static IBackupFactory _backupFactory;
public UserHandler(IBackupFactory backupFactory)
{
_backupFactory = backupFactory;
}
public static void Init(string[] subCommands)
{
var users = _backupFactory.GetFtpUsers();
}
Run Code Online (Sandbox Code Playgroud)
我该如何解决这个问题,以便我可以在另一个类中使用构造函数注入,而只需在启动时对其进行初始化?
该_backupFactory为null,因为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();
}
}
Run Code Online (Sandbox Code Playgroud)
剩下的就是让 Autofac 解析方法中的IUserHandler类型Main。
static void Main(string[] args)
{
IContainer container = AutoFacBootstrapper.Init();
IUserHandler startPoint = container.Resolve<IUserHandler>();
startPoint.PerformSomeAction();
}
Run Code Online (Sandbox Code Playgroud)
附带说明一下,随着应用程序变得越来越大并且将创建新的项目,在类中注册应用程序的所有类型AutoFacBootstrap并未指明。
最好在每个将继承的项目中都有一个单独的类,该类Autofac.Module将覆盖该Load方法。通过这种方式,您将可以访问ContainerBuilder并注册所有所需的类型(来自该程序集)。
有关更多详细信息,请查看Autofac 文档中的模块部分
| 归档时间: |
|
| 查看次数: |
2935 次 |
| 最近记录: |