在不同类的控制台应用程序中使用 AutoFac 构造函数注入

4

我有一个想法,感觉自己可能漏掉了什么东西,但基本上我正在制作一个控制台应用程序,它将调用多个处理程序。

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中使用我的工厂,但是当我试图在另一个类中(比如UserHandler.cs)使用我的工厂时,我的_backupFactory将保持为null(这是有道理的)。

UserHandler.cs

private static IBackupFactory _backupFactory;
public UserHandler(IBackupFactory backupFactory)
{
    _backupFactory = backupFactory;
}

public static void Init(string[] subCommands)
{
    var users = _backupFactory.GetFtpUsers();
}

我该如何修复这个问题,以便我可以在另一个类中使用构造函数注入,同时只需要在启动时初始化它?
1个回答

6

_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类中注册应用程序的所有类型是不明智的。
最好在每个项目中有一个单独的类继承Autofac.Module,这个类将具有Load方法的重写。这样,您将可以访问ContainerBuilder并能够注册所有所需类型(从该程序集中)。
请查看Autofac文档中的Modules部分以获取更多详细信息。

我稍后会查看模块,但是将我的处理程序也注入其中是一个好主意,谢谢! - Jordec

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接