.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,链接也很棒!