首页 > 解决方案 > 带有流式阅读器的 AutoFac SingleInstance

问题描述

我应该如何注册/配置容器,以便文件读取器不必为每个请求(实际上是证书)继续读取文件,证书在运行时不会改变

将服务注册到容器中

public static void AddMyService(this ContainerBuilder builder)
        {
            builder.Register(context =>
            {
                var configuration = context.Resolve<IConfiguration>();
                var options = configuration.GetOptions<ServiceOptions>(SectionName);

                return options;
            }).SingleInstance();
            builder.RegisterType<MyService>().As<IMyService>()
                .InstancePerDependency();
        }

服务实施

public CustomStuff DoCustomStuff(...) 
{
   ...
   using (var fileStream = File.OpenRead(_options.SomePath))
   {
      ...
   }
}

标签: c#dependency-injection.net-coreautofac

解决方案


这里有几个选项,但我个人只是创建一个新类来保存您正在阅读的数据,因为它使注册更加清晰。看起来您不需要保持文件流打开,您只需阅读一次就可以忘记它。

public class Certificate
{
    public Certificate(string value)
    {
        Value = value;
    }

    public string Value { get; }
}
private static string ReadFile(ServiceOptions options)
{
    return File.ReadAllText(options.SomePath);
}

然后您可以将其注册为单例并将其注入您的 MyService 实现:

builder.Register(context =>
    {
        var options = context.Resolve<ServiceOptions>();
        var data = ReadFile(options);
        return new Certificate(options.SomePath);
    })
    .As<Certificate>()
    .SingleInstance();

推荐阅读