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

C# 在不同类的控制台应用程序中使用AutoFac构造函数注入,c#,autofac,constructor-injection,C#,Autofac,Constructor Injection,所以我的想法是,我在这里遗漏了一些东西,但我基本上是在制作一个控制台应用程序,它将调用多个处理程序 Program.cs 如何修复此问题,以便在另一个类中使用构造函数注入,而只需在启动时对其进行初始化?由于从未调用UserHandler构造函数,因此\u backupFactory为空 要解决此问题,还需要为UserHandler创建一个接口,并在AutoFacBootstrapper中注册类型 interface IUserHandler { void PerformSomeActio

所以我的想法是,我在这里遗漏了一些东西,但我基本上是在制作一个控制台应用程序,它将调用多个处理程序

Program.cs


如何修复此问题,以便在另一个类中使用构造函数注入,而只需在启动时对其进行初始化?

由于从未调用
UserHandler
构造函数,因此
\u backupFactory
为空

要解决此问题,还需要为
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();
    }
}
作为旁注,由于应用程序越来越大,并且将创建新项目,因此未指示在
AutoFacBootstrap
类中注册所有类型的应用程序

最好在每个项目中有一个单独的类,该类将继承
Autofac.Module
,该类将覆盖
Load
方法。这样,您就可以访问
ContainerBuilder
,并能够注册所有所需的类型(来自该程序集)


有关更多详细信息,请查看Autofac文档中的部分

稍后我将查看模块,但将我的处理程序同时注入是一个好主意,谢谢!
public static IContainer Init()
{
    var builder = new ContainerBuilder();
    builder.RegisterType<BackupFactory>().As<IBackupFactory>();

    return builder.Build();
}
private static IBackupFactory _backupFactory;
public UserHandler(IBackupFactory backupFactory)
{
    _backupFactory = backupFactory;
}

public static void Init(string[] subCommands)
{
    var users = _backupFactory.GetFtpUsers();
}
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();
    }
}
    static void Main(string[] args)
    {
        IContainer container = AutoFacBootstrapper.Init();

        IUserHandler startPoint = container.Resolve<IUserHandler>();
        startPoint.PerformSomeAction();
    }