我正在创建一个REST框架,想知道是否可以为服务提供商提供访问权限,因为它将用于工厂。我有一个通用的服务,其中包含在创建和更新时触发的事件。
我正在工厂中为我的服务注册事件,目前我暴露了一个
用户将需要访问一些额外的依赖项来进行他们的事件,因此我已经给予他们访问
使用服务定位模式进行注册的缺点是什么?
我应该掩盖IServiceProvider并创建一些泛型重载来自动解决它们的依赖关系吗?
public event Func<object, TDTO, Task> CreateEvent;
protected virtual async Task OnCreated(TDTO dto)
{
await ServiceEventHandlerRule.OnServiceEvent(CreateEvent, this, dto);
}
public async Task<TDTO> Create(TDTO dto)
{
var entity = this.DtoToEntity(dto, new TEntity());
this._context.Set<TEntity>().Add(entity);
dto = await this.SaveEntity(entity);
await OnCreated(dto);
return dto;
}
我正在工厂中为我的服务注册事件,目前我暴露了一个
Func<IServiceProvider, Object, TDto>
事件注册,它看起来像这样,在我的 startup.cs 文件中:var serviceConfig = new ServiceConfiuration<User, UserDTO>();
serviceConfig.EventMapping.AddCreateEvent(async (sp, obj, dto) => {
var hubTaskQueue = sp.GetService<IHubServiceTaskQueue>();
hubTaskQueue.QueueCreate<THub, TDTO>(dto);
});
services.AddScopedRestService(serviceConfig);
用户将需要访问一些额外的依赖项来进行他们的事件,因此我已经给予他们访问
IServiceProvider
的权限。使用服务定位模式进行注册的缺点是什么?
我应该掩盖IServiceProvider并创建一些泛型重载来自动解决它们的依赖关系吗?
Func<Type, object>
也可以成为服务定位器。无论是在库还是在主应用程序中,都没有关系。这仍然是服务定位器。 - StevenFunc<T>
方法来定义事件,而是定义一个工厂抽象,用户可以重写以拦截根类型的创建。在你的情况下,你的根类型似乎是事件处理程序?然后用户可以使用常见的实践,比如构造函数注入,来定义他们的事件处理程序,事件处理程序工厂可以解析它们的依赖项。 - Steven