gpt4 book ai didi

c# - Service Locator 是可插拔架构中的反模式吗?

转载 作者:太空宇宙 更新时间:2023-11-03 15:44:49 25 4
gpt4 key购买 nike

我知道这个问题看起来像是重复的,但请让我解释一下。

所以我创建了几个使用可插拔架构的组件,基本上我可以自由添加新的实现,它们会自动为我注入(inject)和处理。这在多种情况下非常方便。

我将讨论最简单的一个,验证组件。

使用这样的设计的原因之一是我喜欢明确地公开我的角色,如 Udi Dahan 所解释的那样

基本上我有这样的代码:

public interface IValidatorRuner
{
void Run<TTarget>(TTarget target);
}

public class ValidatorRunenr : IValidatorRuner
{
private readonly IServiceLocator _serviceLocator;

public ValidatorRunenr(IServiceLocator serviceLocator)
{
_serviceLocator = serviceLocator;
}

public void Run<TTarget>(TTarget target)
{
// this is the dynamic/pluggable phase
// is this an antipattern???
var foundValdiators = _serviceLocator.GetAllInstances<IValidator<TTarget>>();

foreach (var valdiator in foundValdiators)
{
valdiator.IsSatisfiedBy(target);
}
}
}

这段代码让我可以像这样显式地公开我的验证规则:

//this will allow me to create validators in this way
//and they will be automatically injected and resolved for me
//(easy, to read, easy to write, easy to test, pff I could even smoke this validator easily)
public class OneValdiationRuleExplicitlyExposedAndEasyToTest : IValidator<Person>
{
public bool IsSatisfiedBy(Person target)
{
return target.Age > 18;
}
}

public class Person
{
public int Age { get; set; }
}

public interface IValidator<TTarget>
{
bool IsSatisfiedBy(TTarget target);
}

我将像这样使用这段代码:

//usage
public class SomeCommandHandler
{
private readonly IValidatorRuner _validatorRuner;

public SomeCommandHandler(IValidatorRuner validatorRuner)
{
_validatorRuner = validatorRuner;
}

public void SomeMethod()
{
_validatorRuner.Run(new Person{Age = 16});
}
}

验证只是一个例子,我还用它来触发域事件并以相同的可插入方式运行管道和过滤器

以这种方式使用服务定位器是一种反模式吗?

我知道我可能隐藏了一些依赖项,但问题是这些依赖项是在应用程序初始化时动态注入(inject)和发现的 (Composition root)

我们将不胜感激您的想法

最佳答案

在我看来,您的代码示例的主要问题是服务定位器本身被注入(inject)到 ValidatorRunner 的实现中。对我来说,这是一种反模式,但也许不是您要问的那种模式。

我可能给出的任何答案都归结为您的服务定位器实现的能力。但可以肯定的是,它不应该传递到你的类的构造函数中。相反,当您要求服务定位器实现“IValidatorRuner”时,服务定位器本身应该传递这些东西

例如,您可以注入(inject)一个知道如何为给定类型加载动态验证器实例的工厂。

关于c# - Service Locator 是可插拔架构中的反模式吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28574472/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com