C# Autofac-从DependencyResolver.Current.GetService创建的InstancePerRequest<&燃气轮机;()-什么时候发布?

C# Autofac-从DependencyResolver.Current.GetService创建的InstancePerRequest<&燃气轮机;()-什么时候发布?,c#,asp.net-mvc,autofac,dependency-resolver,C#,Asp.net Mvc,Autofac,Dependency Resolver,在.NET中的API控制器项目中,我正在使用一个服务,比如说SomeService,只需要一次初始化(不是每个请求或每个SomeService实例)(虽然我不认为这与此相关,但这里对init部分的解释是:一旦创建了api,它就会在Azure存储中进行一些设置。对SomeService的每个实例这样做的成本是不必要的。因此Global.asax中有以下行 new SomeService().Init(); 现在,我使用Autofac进行依赖注入。我将SomeService注册为ISomeServ

在.NET中的API控制器项目中,我正在使用一个服务,比如说
SomeService
,只需要一次初始化(不是每个请求或每个SomeService实例)(虽然我不认为这与此相关,但这里对init部分的解释是:一旦创建了api,它就会在Azure存储中进行一些设置。对
SomeService
的每个实例这样做的成本是不必要的。因此Global.asax中有以下行

new SomeService().Init();
现在,我使用
Autofac
进行依赖注入。我将
SomeService
注册为
ISomeService
InstancePerRequest
(因为
SomeService
不是线程安全的)。因此,现在我想通过容器中的实例初始化Global.asax中的某个服务。但是,如果我尝试从容器中获取实例,如中所示

container.Resolve<ISomeService>().Init();
因此,在Global.asax中,我得到了错误解释中建议的一个实例

DependencyResolver.Current.GetService<ISomeService>().Init();
DependencyResolver.Current.GetService().Init();

我想知道的是,我从当前的
获取的
SomeService
实例是否已发布?因为没有真正的请求,我不确定。最坏的情况是,我可以通过
new

从混凝土中获取实例。您试图将2个职责合并为1个组件,这会破坏系统

为了解决此问题,您可以将该组件与一个将初始化azure存储的组件(例如,
IStorageProvider
)和另一个将执行此任务的组件拆分。
IStorageProvider
将声明为
SingleInstance
(并在需要时实现
IStartable
)另一个组件将使用此组件

public class AzureStorageProvider : IStorageProvider, IStartable
{
    public void Start()
    {
        // initialize storage
        this._storage = new ...
    }
} 


public class SomeService : ISomeService
{
    public SomeService(IStorageProvider storageProvider) 
    { 
        this._storageProvider = storageProvider;
    }

    private readonly IStorageProvider _storageProvider; 

    public void Do()
    {
        // do things with storage
        this._storageProvider.Storage.ExecuteX(); 
    }
}
以及注册:

builder.RegisterType<AzureStorageProvider>().As<IStorageProvider>().SingleInstance(); 
builder.RegisterType<SomeService>().As<ISomeService>().InstancePerRequest();

您有一些优点。IStartable似乎是一个很好的解决方案,但是我不想添加任何与特定容器相关的内容(例如IStartable)到包含服务的dll。一些可以使用Autofac,一些使用其他东西。此外,如果我为初始化目的构建另一个服务并将其注册为singleton,其实例也将不会发布。我同意,这更多是按照书本上的规定。但实际上没有任何更改。我说的对吗?如果您将初始值设定项注册为singleton,则实例将在应用程序停止时处理。但我认为这不是一个真正的问题,因为您不需要处理它,据我所知,您只需要处理
SomeService
builder.RegisterType<AzureStorageProvider>().As<IStorageProvider>().SingleInstance(); 
builder.RegisterType<SomeService>().As<ISomeService>().InstancePerRequest();
builder.Register(c => c.Resolve<IStorageProvider>().Storage).As<IStorage>();