Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/301.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用Autofac将依赖项注入控制台应用程序的主入口点_C#_Autofac - Fatal编程技术网

C# 使用Autofac将依赖项注入控制台应用程序的主入口点

C# 使用Autofac将依赖项注入控制台应用程序的主入口点,c#,autofac,C#,Autofac,假设我有一个简单的控制台应用程序: public static class Program { private static ILog Log { get; set; } public static void Main() { Log.Write("Hello, world!"); } } 使用Autofac注入日志实例并确保日志属性在运行时不为null的最简单方法是什么?问题是我无法通过Main()将其传递进来,我试图避免使用容器的服务位置(

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

public static class Program
{
    private static ILog Log { get; set; }

    public static void Main()
    {
        Log.Write("Hello, world!");
    }
}

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

您必须在某处配置容器。在控制台应用程序中,
Main()。此类可以具有具有依赖项的构造函数。您可以在main中解析这个类并调用它。然后,应将该类视为整个应用程序。在
程序
类中发生的一切现在都可以被视为您的

//**开始合成根目录
公共静态类程序
{
公共静态void Main(字符串[]args)
{
var container=ConfigureContainer();
var application=container.Resolve();
application.Run(args);//在此处将运行时数据传递给应用程序
}
专用静态IContainer配置容器()
{
var builder=new ContainerBuilder();
builder.RegisterType.AsSelf();
builder.RegisterType().As();
//注册所有依赖项(以及这些依赖项的依赖项等)
返回builder.Build();
}
}
//**末端组成根
公共类应用程序逻辑
{
私有只读ILog日志;
公共应用程序逻辑(ILog日志)=>this.log=log;
public void Run(string[]args)=>this.log.Write(“你好,世界!”);
}

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

必须更改builder.RegisterType.AsSelf()builder.RegisterType().AsSelf()为了让它为我工作

我创建了一个启动文件来注册所有的autofac文件,使它更干净

还在nuget中创建了一个模板,您可以直接使用dotnet安装进行安装

下面是我的帖子,来描述模板中到底包含了什么,希望它能帮助我们更清楚地将autofac与控制台应用程序结合使用


尽管如此,由于程序是一个静态类,它可以在程序的静态构造函数中完成:)对于那些不了解DI容器将构成整个对象图的人,您可能需要进一步澄清这一点。它还可以帮助演示将主参数传递到ApplicationLogic的用法。
// ** Begin composition root
public static class Program
{
    public static void Main(string[] args) 
    {
        var container = ConfigureContainer();
        var application = container.Resolve<ApplicationLogic>();

        application.Run(args); // Pass runtime data to application here
    }

    private static IContainer ConfigureContainer()
    {
        var builder = new ContainerBuilder();
        
        builder.RegisterType<ApplicationLogic>.AsSelf();
        builder.RegisterType<Log>().As<ILog>();
        // 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!");
}