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

时间:2017-10-29 16:31:38

标签: c# autofac constructor-injection

所以我认为我在这里遗漏了一些东西,但我基本上都在制作一个可以调用多个处理程序的控制台应用程序。

  

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 个答案:

答案 0 :(得分:3)

_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();
    }
}

剩下的是,Autofac可以解析IUserHandler方法中的Main类型。

    static void Main(string[] args)
    {
        IContainer container = AutoFacBootstrapper.Init();

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

作为旁注,随着应用程序越来越大并且将创建新项目,未指示在AutoFacBootstrap类中注册所有类型的应用程序。

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

查看Autofac文档中的Modules部分以获取更多详细信息