使用Autofac将依赖项注入控制台应用程序中的Main入口点

说我有一个简单的控制台应用程序:

public static class Program { private static ILog Log { get; set; } public static void Main() { Log.Write("Hello, world!"); } } 

我可以使用Autofac注入Log实例并确保Log属性在运行时不为null的最简单方法是什么? 问题是我不能通过Main()传递它,我试图避免使用容器的服务位置(只是因为)。

你应该做的是从你的主要提取所有逻辑到一个类。 这个类可以有一个带依赖的构造函数。 您在main中解析此类并调用它。 然后,该类应被视为整个应用程序 。 现在可以将Program类中发生的所有内容视为您的Composition Root 。

 // Begin composition root public static class Program { public static void Main(string[] args) { var container = ConfigureContainer(); var application = container.Resolve(); application.Run(args); // Pass runtime data to application here } private static IContainer ConfigureContainer() { var builder = new ContainerBuilder(); builder.RegisterType.AsSelf(); builder.RegisterType().As(); // Register all dependencies (and dependencies of those dependencies, etc) return builder.Build(); } } // End composition root public class ApplicationLogic { private readonly ILog log; public ApplicationLogic(ILog log) { this.log = log; } public void Run(string[] args) { this.log.Write("Hello, world!"); } } 

请注意, container.Resolve() 不仅解析ApplicationLogic类,它还解析整个对象图,包括ApplicationLogic所有依赖关系,以及这些依赖关系的依赖关系等,无论图形有多深。 您唯一负责的是在ConfigureContainer()方法中注册这些依赖项。 因此,使用任何超过1个Resolve()方法调用控制台应用程序是有点不寻常的,如果存在,则应始终在组合根目录内调用或连接它们。

您必须在某处配置容器。 在控制台应用程序中, Main()通常就是那个地方。