编程语言
首页 > 编程语言> > c#-服务定位器反模式可以在工厂注册

c#-服务定位器反模式可以在工厂注册

作者:互联网

我正在创建一个REST框架,我想知道是否可以提供对服务提供商的访问权限,因为它将在工厂中使用.我有一个通用服务,其中包含在创建和更新时触发的事件

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并进行一些泛型重载,以自动解决其依赖关系吗?

解决方法:

Dependency Injection in .NET, second edition中,我们将服务定位器定义为:

A Service Locator supplies application components outside the Composition Root with access to an unbounded set of Volatile Dependencies. [Chapter 5.2]

组合根是应用程序中模块组合在一起的单个逻辑位置.您可以从这本书中找到有关this excerpt中成分根的详细说明.

关于您的问题,服务定位器定义的重要部分是:“组合根之外”.换句话说,从“合成根”内部访问无限制的一组“挥发性依赖关系”是可以的,并且不是“服务定位器”反模式的实现.但是,在“合成根”之外访问它们是一种反模式.

因此,要回答您的问题,您可以放心地让工厂依赖于容器或抽象来解析无限制的一组依赖关系,只要工厂实现是组成根目录的一部分即可.

您可以通过在应用程序的启动程序集中创建工厂实现的同时,将工厂的抽象放置在靠近应用程序逻辑的位置来实现.

Users will need access to a few extra dependencies for their events so I’ve given them access to the IServiceProvider, What is the downside of using the Service Location Pattern During Registration?

如果依赖IServiceProvider的代码不属于“合成根”,则它们将使用“服务定位器”反模式,因此应避免这种情况.服务定位器反模式的主要问题是:

>模块将服务定位器作为冗余依赖项拖动.
>该模块使它的依赖关系变得不明显.这使得这样的模块更难测试,掩盖了类可能太复杂的事实,并且使得依赖关系图的正确性变得更加困难,因为依赖关系是延迟获取的.

相反,您应该让这些用户将其依赖项定义为构造函数参数.

标签:service-locator,net-core,rest,dependency-injection,c
来源: https://codeday.me/bug/20191025/1925942.html