C# - Autofac 解析不同类中的新实例

标签 c# singleton autofac

刚开始使用 Autofac!我想在多个类中使用相同的 Logger 实例,但 Autofac 在不同的类中为我提供了一个新的 Logger 实例。

IocBuilder.cs

public static class IoCBuilder
{
    public static IContainer Container()
    {
        var logger = new LoggerConfiguration()
                .MinimumLevel.Verbose()
                .WriteTo.Console(outputTemplate: outputTemplate)
                    .WriteTo.File("logs/log-.log",
                                  outputTemplate: outputTemplate,
                                  rollingInterval: RollingInterval.Day)
                    .CreateLogger();

        // Container
        var builder = new ContainerBuilder();
        builder.RegisterInstance(logger).As<ILogger>().SingleInstance();
        builder.RegisterType<MyOtherClass>().SingleInstance();

        return builder.Build();
    }
}

MyOtherClass.cs

public class MyOtherClass
{
    public ILogger Logger {get; set; }
    public MyOtherClass(ILogger logger)
    {
         Logger = logger;
    }

    public void FirstMethod()
    {
        Logger.Information("MyOtherClass- FirstMethod");
    }

    public void SecondMethod()
    {
        Logger.Information("MyOtherClass - SecondMethod");
    }
}

Program.cs

public static IContainer Container
{
    get { return IoCBuilder.Container(); }
}

static void Main(string[] args)
{
    using (var scope = Container.BeginLifetimeScope())
    {
        var settings = Container.Resolve<ISettings>();
        var logger = Container.Resolve<ILogger>();
        logger.Information($"From program class: {settings.ToString()}"); // Prints log in log-20171217.log file

        var myOtherClass = Container.Resolve<MyOtherClass>();
        myOtherClass.FirstMethod(); // Prints log in log-20171217_1.log file
        myOtherClass.SecondMethod(); // Prints log in log-20171217_1.log file
    } // using scope   
} // void main

Duplicate log files

我想在整个应用程序中使用 Logger 类的单个实例。非常感谢任何帮助!

最佳答案

问题是你在这里创建了一个新的容器实例:

public static IContainer Container
{
    get { return IoCBuilder.Container(); }
}

每次您获得 Program.Container 的值时,您都会获得整个容器的一个新实例。容器的每个新实例都会创建一个新的记录器实例。

你必须在 Program 中缓存容器,像这样:

private static IContainer _container = IoCBuilder.Container();

public static IContainer Container
{
    get { return _container; }
}

关于C# - Autofac 解析不同类中的新实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47858251/

相关文章:

c# - 如何在 MVC.Net 中为无尽类别树编写 Foreach 循环?

c# - 将开发从 Windows 转移到 Linux

c# - 为什么我的用户控件一直将其可见属性重置为 false?

c# - List<T>.FindIndex 多个结果?

Autofac WithKey 属性未按预期工作(多个实现)

ios - 设备关闭时如何阻止文本字段和选取的图像消失

c# - C#中的单例类设计,这两个类是等价的吗?

swift - 失去单例的值(value)

c# - Autofac 启用类拦截器

c# - 找不到方法 : 'Nancy. ErrorPipeline Nancy.ErrorPipeline.op_Addition