1

我正在尝试使用Microsoft.Extensions.DependencyInjectionandAutofac.Extensions.DependencyInjection包将 Autofac 与 .NET Core 控制台应用程序一起使用,但我的模块中的加载方法永远不会被调用,并导致Program在解析期间为空。我希望它们在我调用AddAutofac()扩展方法或构建服务提供者时加载。

using Autofac;
using Autofac.Extensions.DependencyInjection;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using System;
using System.Collections.Generic;
using System.IO;

public class Startup
{
    private static void Main(string[] args)
    {               
        var services = new ServiceCollection();

        services.AddAutofac(builder =>
        {
            builder.RegisterModule(new MyFirstModule(configuration));
            builder.RegisterModule(new MySecondModule(configuration));
        });

        using (var serviceProvider = services.BuildServiceProvider())
        {
            var program = serviceProvider.GetService<Program>();
            program.Start();
        }
    }
}
4

2 回答 2

2

根据这个问题,当AddAutofac方法被添加到文档中时,它也被拆分为ASP.NET Core.NET Core。显然,AddAutofac特定于 ASP.NET Core 应用程序(因此有不同的文档)。

对于控制台应用程序,注册应如下所示:

using Autofac;
using Autofac.Extensions.DependencyInjection;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using System;
using System.Collections.Generic;
using System.IO;

public class Startup
{
    private static void Main(string[] args)
    {               
        var services = new ServiceCollection();
        var builder = new ContainerBuilder();

        // Once you've registered everything in the ServiceCollection, call
        // Populate to bring those registrations into Autofac. This is
        // just like a foreach over the list of things in the collection
        // to add them to Autofac.
        containerBuilder.Populate(services);

        // Make your Autofac registrations. Order is important!
        // If you make them BEFORE you call Populate, then the
        // registrations in the ServiceCollection will override Autofac
        // registrations; if you make them AFTER Populate, the Autofac
        // registrations will override. You can make registrations
        // before or after Populate, however you choose.
        builder.RegisterModule(new MyFirstModule(configuration));
        builder.RegisterModule(new MySecondModule(configuration));

        // Creating a new AutofacServiceProvider makes the container
        // available to your app using the Microsoft IServiceProvider
        // interface so you can use those abstractions rather than
        // binding directly to Autofac.
        var container = containerBuilder.Build();
        var serviceProvider = new AutofacServiceProvider(container);

        var program = serviceProvider.GetService<Program>();
        program.Start();
    }
}   
于 2018-03-19T05:50:16.487 回答
0

您的入口点应Program.cs位于 dotnet 核心应用程序中。另外我不确定你为什么有一个私有的 Main 方法。但无论如何,请按照以下步骤操作

Autofac 文档说:

您不必使用 Microsoft.Extensions.DependencyInjection。如果您没有编写需要它的 .NET Core 应用程序,或者您没有使用其他库提供的任何 DI 扩展,则可以直接使用 Autofac。

您实际上可以在没有扩展的情况下使用 Autofac。查看一个非常基本的 dotnet 核心控制台应用程序示例。确保安装 nuGet 包 Autofac(当前版本 4.8.1)

我们可以有一个接口:

public interface IPrintService
{
    void Print();
}

以及这个接口的一个实现。

public class PrintService
    : IPrintService
{
    public void Print()
    {
        Console.WriteLine("I am a print service injected");
    }
}

然后我们可以有一个类,例如,我们IPrintService通过其构造函数注入 a

public class Client
{
    public Client(IPrintService printService)
    {
        printService.Print();
    }
}

最后,在主控制台程序中,我们可以配置 Autofac 并注册服务。请注意,我决定自动激活一个Client实例只是为了说明一个示例并证明 Autofac 正在注入所需的实现。

class Program
{
    static void Main(string[] args)
    {
        ConfigureIoCc();
        Console.WriteLine("Using Autofac");
        Console.ReadKey();
    }

    public static IContainer ConfigureIoCc()
    {
        var builder = new ContainerBuilder();

        builder
            .RegisterType<PrintService>()
            .As<IPrintService>();

        builder
            .RegisterType<Client>()
            .AsSelf()
            .AutoActivate(); //to automatically instantiate it

        var container = builder.Build();
        return container;
    }
}
于 2018-10-11T16:06:50.550 回答