Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/20.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
.net 在Singleton中使用作用域服务可以吗?_.net_Dependency Injection - Fatal编程技术网

.net 在Singleton中使用作用域服务可以吗?

.net 在Singleton中使用作用域服务可以吗?,.net,dependency-injection,.net,Dependency Injection,将作用域的IServiceProvider传递给单例可以吗 上下文是我有一个单例IMedialLibraryObservable,它有一个内部观察者列表。这是为了触发钩子,比如OnAdding、OnDeleting等 观察者是可以实现他们想要的并重用已注册服务的接口。为了让他们能够访问所需的内容,作为方法的一部分传递了一个作用域IServiceProvider 代码如下: 启动注册: services.AddSingleton<IMediaLibraryObservable<Medi

作用域的
IServiceProvider
传递给单例可以吗

上下文是我有一个单例
IMedialLibraryObservable
,它有一个内部观察者列表。这是为了触发钩子,比如OnAdding、OnDeleting等

观察者是可以实现他们想要的并重用已注册服务的接口。为了让他们能够访问所需的内容,作为方法的一部分传递了一个作用域
IServiceProvider

代码如下:

启动注册:

services.AddSingleton<IMediaLibraryObservable<MediaEventInfo>, MediaLibraryObservable>();
public interface IMediaLibraryObservable
{
    Task OnAdding(IServiceProvider _serviceProvider, MediaEventInfo info);
    ...
public async Task OnAdding(IServiceProvider _serviceProvider, MediaEventInfo info)
        {
            foreach (var observer in observers)
                await observer.OnAdding(_serviceProvider, info);
        }
public async Task OnAdding(IServiceProvider _serviceProvider, MediaEventInfo info)
        {
            using (var ms = new MemoryStream())
            {
                await info.File.CopyToAsync(ms);
                var path = await ServiceProviderHelpers.GetService<IBlobStorage>(_serviceProvider).WriteAsync(info.ContentItem.InternalName, ms);
private readonly IMediaLibraryObservable _mediaLibraryObservable;
private readonly IServiceProvider _serviceProvider;

public MediaLibraryService(IMediaLibraryObservable mediaLibraryObservable, IServiceProvider serviceProvider) {
  _mediaLibraryObservable = mediaLibraryObservable;
  _serviceProvider = serviceProvider;
}

public async Task < bool > UploadBlob(string fullPath, FormFileDto file) {
  ...
  await _mediaLibraryObservable.OnAdding(_serviceProvider, info);
  ...
}
OnAdding的实现:

services.AddSingleton<IMediaLibraryObservable<MediaEventInfo>, MediaLibraryObservable>();
public interface IMediaLibraryObservable
{
    Task OnAdding(IServiceProvider _serviceProvider, MediaEventInfo info);
    ...
public async Task OnAdding(IServiceProvider _serviceProvider, MediaEventInfo info)
        {
            foreach (var observer in observers)
                await observer.OnAdding(_serviceProvider, info);
        }
public async Task OnAdding(IServiceProvider _serviceProvider, MediaEventInfo info)
        {
            using (var ms = new MemoryStream())
            {
                await info.File.CopyToAsync(ms);
                var path = await ServiceProviderHelpers.GetService<IBlobStorage>(_serviceProvider).WriteAsync(info.ContentItem.InternalName, ms);
private readonly IMediaLibraryObservable _mediaLibraryObservable;
private readonly IServiceProvider _serviceProvider;

public MediaLibraryService(IMediaLibraryObservable mediaLibraryObservable, IServiceProvider serviceProvider) {
  _mediaLibraryObservable = mediaLibraryObservable;
  _serviceProvider = serviceProvider;
}

public async Task < bool > UploadBlob(string fullPath, FormFileDto file) {
  ...
  await _mediaLibraryObservable.OnAdding(_serviceProvider, info);
  ...
}
观察者实现:

services.AddSingleton<IMediaLibraryObservable<MediaEventInfo>, MediaLibraryObservable>();
public interface IMediaLibraryObservable
{
    Task OnAdding(IServiceProvider _serviceProvider, MediaEventInfo info);
    ...
public async Task OnAdding(IServiceProvider _serviceProvider, MediaEventInfo info)
        {
            foreach (var observer in observers)
                await observer.OnAdding(_serviceProvider, info);
        }
public async Task OnAdding(IServiceProvider _serviceProvider, MediaEventInfo info)
        {
            using (var ms = new MemoryStream())
            {
                await info.File.CopyToAsync(ms);
                var path = await ServiceProviderHelpers.GetService<IBlobStorage>(_serviceProvider).WriteAsync(info.ContentItem.InternalName, ms);
private readonly IMediaLibraryObservable _mediaLibraryObservable;
private readonly IServiceProvider _serviceProvider;

public MediaLibraryService(IMediaLibraryObservable mediaLibraryObservable, IServiceProvider serviceProvider) {
  _mediaLibraryObservable = mediaLibraryObservable;
  _serviceProvider = serviceProvider;
}

public async Task < bool > UploadBlob(string fullPath, FormFileDto file) {
  ...
  await _mediaLibraryObservable.OnAdding(_serviceProvider, info);
  ...
}
添加上的公共异步任务(IServiceProvider\u serviceProvider,MediaEventInfo) { 使用(var ms=new MemoryStream()) { wait info.File.CopyToAsync(ms); var path=await ServiceProviderHelpers.GetService(_serviceProvider).WriteAsync(info.ContentItem.InternalName,ms); 可观察的触发器(其中范围IServiceProvider被传递到单例可观察):

services.AddSingleton<IMediaLibraryObservable<MediaEventInfo>, MediaLibraryObservable>();
public interface IMediaLibraryObservable
{
    Task OnAdding(IServiceProvider _serviceProvider, MediaEventInfo info);
    ...
public async Task OnAdding(IServiceProvider _serviceProvider, MediaEventInfo info)
        {
            foreach (var observer in observers)
                await observer.OnAdding(_serviceProvider, info);
        }
public async Task OnAdding(IServiceProvider _serviceProvider, MediaEventInfo info)
        {
            using (var ms = new MemoryStream())
            {
                await info.File.CopyToAsync(ms);
                var path = await ServiceProviderHelpers.GetService<IBlobStorage>(_serviceProvider).WriteAsync(info.ContentItem.InternalName, ms);
private readonly IMediaLibraryObservable _mediaLibraryObservable;
private readonly IServiceProvider _serviceProvider;

public MediaLibraryService(IMediaLibraryObservable mediaLibraryObservable, IServiceProvider serviceProvider) {
  _mediaLibraryObservable = mediaLibraryObservable;
  _serviceProvider = serviceProvider;
}

public async Task < bool > UploadBlob(string fullPath, FormFileDto file) {
  ...
  await _mediaLibraryObservable.OnAdding(_serviceProvider, info);
  ...
}
私有只读IMedialLibraryObservable\u mediaLibraryObservable;
私有只读服务器ViceProvider\u服务提供商;
公共媒体库服务(IMedialLibraryObservable媒体库Observable,iSeries虚拟Provider服务提供商){
_mediaLibraryObservable=mediaLibraryObservable;
_服务提供者=服务提供者;
}
公共异步任务UploadBlob(字符串完整路径,FormFileDto文件){
...
wait mediaLibraryObservable.OnAdding(serviceProvider,info);
...
}

在Singleton中使用作用域服务是可以的,只要您不在Singleton中存储该作用域服务,因为这会导致出现错误。谢谢Steven,链接也很棒!