Create scope factory in asp.net core

后端 未结 1 1148
-上瘾入骨i
-上瘾入骨i 2021-02-20 10:25

I want to create scoped container in asp.net core and use it in 2 methods of my singleton method.

I\'ve tried create this in each method of sigleton. it works, but i thin

1条回答
  •  礼貌的吻别
    2021-02-20 11:16

    It is technically not incorrect the way you do it. If you are within a singleton service and you need to access scoped services, then you should create a new service scope and retrieve the services from that scope’s service provider. And when you are done, you should also dispose the scope.

    In practice, you can simplify this a bit. You should avoid having to inject IServiceProvider directly into a service. Instead, you can just inject the IServiceScopeFactory directly. And then you should also create the scope with a using statement to make sure that it is disposed properly after use.

    So an example singleton service could look like this:

    public class ExampleSingletonService
    {
        private readonly IServiceScopeFactory _serviceScopeFactory;
    
        public ExampleSingletonService(IServiceScopeFactory serviceScopeFactory)
        {
            _serviceScopeFactory = serviceScopeFactory;
        }
    
        public async Task DoSomethingAsync()
        {
            using (var scope = _serviceScopeFactory.CreateScope())
            {
                var db = scope.ServiceProvider.GetService();
    
                db.Add(new Foo());
                await db.SaveChangesAsync();
            }
        }
    }
    

    As you can see, there isn’t really that much overhead for this. But of course this makes you think twice about whether you want to use a scoped service within a singleton or not.

    0 讨论(0)
提交回复
热议问题