- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我正在基于现有的 Asp.Net 4.5 解决方案创建新的 Asp.Net Core 解决方案。
当前的解决方案使用 Microsoft Unity Container 并且基础设施引用了服务定位器。
我想摆脱服务定位器并避免在我的新基础架构中引用特定的 DI 容器。
我遇到了一个问题,想出一个很好的方法来替换当前的命令/查询/事件调度程序,而不需要任何 DI 容器依赖性。
这是我的 Dispatcher 类
public class Dispatcher : IDispatcher
{
private const string HandleMethodName = "Handle";
public TResponse Request<TResponse>(IQuery<TResponse> query)
{
Type queryType = query.GetType();
// used for when OperationResult<object> was used
Type operationResultTrueReturnType = typeof(TResponse);
if (operationResultTrueReturnType == typeof(object))
{
operationResultTrueReturnType = queryType.GetInterface(typeof(IQuery<>).Name).GenericTypeArguments[0];
}
Type handlerType = typeof(IQueryHandler<,>).MakeGenericType(query.GetType(), operationResultTrueReturnType);
return ExecuteHandler<TResponse>(handlerType, query, queryType);
}
public OperationResult Submit(ICommand command)
{
Type commandType = command.GetType();
var baseTypeAttribute = (CommandBaseTypeAttribute)commandType.GetCustomAttributes(typeof(CommandBaseTypeAttribute), false).FirstOrDefault();
if (baseTypeAttribute != null)
commandType = baseTypeAttribute.BaseType;
try
{
Type handlerType = typeof(ICommandHandler<>).MakeGenericType(commandType);
return ExecuteHandler<OperationResult>(handlerType, command, commandType);
}
catch (InvalidOperationException ex)
{
return new OperationResult(OperationResultStatus.Failure, ex.Message);
}
}
public OperationResult<TResult> Submit<TResult>(ICommand<TResult> command)
{
Type commandType = command.GetType();
var baseTypeAttribute = (CommandBaseTypeAttribute)commandType.GetCustomAttributes(typeof(CommandBaseTypeAttribute), false).FirstOrDefault();
if (baseTypeAttribute != null)
commandType = baseTypeAttribute.BaseType;
try
{
Type handlerType = typeof(ICommandHandler<,>).MakeGenericType(commandType, typeof(TResult));
return ExecuteHandler<OperationResult<TResult>>(handlerType, command, commandType);
}
catch (InvalidOperationException ex)
{
return new OperationResult<TResult>(OperationResultStatus.Failure, default(TResult), ex.Message);
}
}
public void Raise(IDomainEvent domainEvent)
{
Type domainEventType = domainEvent.GetType();
try
{
Type handlerType = typeof(ICommandHandler<>).MakeGenericType(domainEventType);
ExecuteHandler(handlerType, domainEvent, domainEventType);
}
catch (InvalidOperationException)
{
}
}
private static void ExecuteHandler(Type handlerType, object argument, Type argumentType)
{
object handler = ServiceLocator.Current.GetInstance(handlerType);
if (handler == null)
throw new ConfigurationErrorsException("Handler not registered for type " + argumentType.Name);
try
{
MethodInfo handleMethod = handlerType.GetMethod(HandleMethodName, new[] { argumentType });
handleMethod.Invoke(handler, new[] { argument });
}
catch (TargetInvocationException ex)
{
if (ex.InnerException != null)
throw ex.InnerException;
throw;
}
}
private static TReturnValue ExecuteHandler<TReturnValue>(Type handlerType, object argument, Type argumentType)
{
object handler = ServiceLocator.Current.GetInstance(handlerType);
if (handler == null)
throw new ConfigurationErrorsException("Handler not registered for type " + argumentType.Name);
try
{
MethodInfo handleMethod = handlerType.GetMethod(HandleMethodName, new[] { argumentType });
return (TReturnValue)handleMethod.Invoke(handler, new[] { argument });
}
catch (TargetInvocationException ex)
{
if (ex.InnerException != null)
throw ex.InnerException;
throw;
}
}
}
ExecuteHandler 有 ServiceLocator 调用。
如何在不使用它的情况下处理这个问题?
最佳答案
我喜欢评论中提供的建议。如果您想抽象出服务定位器,则让调度程序显式依赖于将用于执行解析的抽象服务提供者(如 IServiceProvider
)。
public class Dispatcher : IDispatcher {
private readonly IServiceProvider serviceProvider;
public Dispatcher (IServiceProvider serviceProvider) {
this.serviceProvider = serviceProvider;
}
//...other code removed for brevity
private object GetService(Type serviceType) {
return serviceProvider.GetService(serviceType);
}
private void ExecuteHandler(Type handlerType, object argument, Type argumentType) {
object handler = GetService(handlerType);
if (handler == null)
throw new ConfigurationErrorsException("Handler not registered for type " + argumentType.Name);
try {
MethodInfo handleMethod = handlerType.GetMethod(HandleMethodName, new[] { argumentType });
handleMethod.Invoke(handler, new[] { argument });
} catch (TargetInvocationException ex) {
if (ex.InnerException != null)
throw ex.InnerException;
throw;
}
}
private TReturnValue ExecuteHandler<TReturnValue>(Type handlerType, object argument, Type argumentType) {
object handler = GetService(handlerType);
if (handler == null)
throw new ConfigurationErrorsException("Handler not registered for type " + argumentType.Name);
try {
MethodInfo handleMethod = handlerType.GetMethod(HandleMethodName, new[] { argumentType });
return (TReturnValue)handleMethod.Invoke(handler, new[] { argument });
} catch (TargetInvocationException ex) {
if (ex.InnerException != null)
throw ex.InnerException;
throw;
}
}
}
调度程序现在不再与服务定位器反模式紧密耦合,并允许使用任何派生的提供程序。这使您可以避免引用特定的 DI 容器。
关于c# - 没有服务定位器的 CQRS 调度程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45064268/
这里有点绝望。我有一个使用由 Node 8.12.0 驱动的 AngularJS (5.4.1) 的遗留测试套件。我想调试一些测试,但似乎不可能。 测试中启用了控制流,因此我按照 the protra
我想知道是否有任何方法可以在我的 html 中定义一个区域(div 标签?),其中模板根据它绑定(bind)到的对象而变化? 假设我们有一个 ShellView/ShellViewModel List
我在 WebDriver 中自动化报告提交过程,报告有多个页面,所有页面中都会有 Next按钮进入下一页。 下一个按钮有一个跟随定位器, Next 问题是所有Next报告中的按钮具有相同的定位器,因为
如果我想找一个也有特定类的中继器怎么办?或者,如果我想查找包含文本的绑定(bind)? 如果我想通过 repeater OR CSS 选择器(匹配具有特定 repeater 表达式 OR 的元素,例如
在我当前的项目中,我们从 XSD 文件生成 JAXB bean。我们需要有关 bean 的行号信息(除了 XSD 验证错误!)所以我使用了此处指定的 -Xlocator 选项: http://java
我有一个 Angular 应用程序,我在其中放置自定义 html 属性(“data-testid='saveButton'”)以用于识别,例如按钮、输入等Protractor 对此没有内置定位器:xp
我是 Protractor 和 E2E 测试的新手,想确定我的 CSS 定位器方法是否适用于同一类的相同元素。 我有一个 HTML Fiddle here它描绘了一个包含两个 div 元素的网页,每个
Delete Edit 我想为“编辑”按钮编写一个 CSS 定位器。它在 [data-credit-card-index="1"] 部分下...那里会有更多的信用卡...所以我必须使
我有 3 个下拉列表,它们不是选择类。所以我需要点击每个元素的向下箭头键。这些箭头键的样式相同:.Select-arrow(使用的火路) HTML: NicknameEx. LarrySaint, L
我正在尝试对我的网站进行测试。在某些用户表单上遇到问题。诀窍是,表单中文本字段的数量因用户选项而异(代码中存在禁用的文本字段,但具有样式 标记),所以我'我试图找到比逐个定位每个元素并用 try/e
I have a problem with ng-binding locator in Protractor code: some_link I tried to use: element(by
假设我正在#myPage 元素下寻找一些 div 元素。 我的目标是使用 CSS 选择器并将搜索限制为 #myPage 后代。 使用 Selenium XPath 定位器,我可以编写如下内容: Web
如何以文本“步骤1.设定 self 开发的方向”为起点,选择Xpath定位器到复选框? 为方便起见,您可以从此处复制文本: pdp-action-item-header__checkbox pdp-a
我需要简要介绍一下根据 IP 地址将内容限制在特定国家/地区背后的弱点。 除了使用位于另一个国家的代理服务器,你能想出另一种方法来绕过这样的系统吗? 最佳答案 基本上,任何使用中介的解决方案都是代理。
我已经让应用程序在 textview 中显示收件箱中当前的所有短信。为了做到这一点,我必须包含 URI。我正在尝试测试我拥有但未通过我的移动运营商(版本)注册的其他手机,因为它们不支持我拥有的手机,因
需要您的帮助来为 Selenium 中的 findElements 方法找到正确的 XPath。详情如下: 网址 - http://www.cleartrip.com/hotels/info/hote
我正在努力掌握我的 xPath 发现,但我遇到了一个问题。我的目标是从表中获取复选框。您能给我一些建议,应该如何始终设置定位器吗? 假设我的目标是指向需要单击的复选框 的input。 首先我尝试了非常
我正在尝试使用 Spring Data Gemfire 设置 Gemfire 集群。 我可以通过 gfsh 启动一个定位器,我可以通过 Spring 启动一个服务器。 问题是,我找不到通过 Sprin
我正在使用基于模型的表单,我的表单如下所示: Submit 我想写一个 Protractor 规范来测试登录。我喜欢在我的规范中做类似下面的事情: element(by.f
有没有一种优雅的方式来获取我已经找到/识别的 Selenium WebElement 的 By 定位器? 要明确这个问题:我希望使用“按定位器”来查找元素。在这种情况下,我不对特定属性或特定定位器(如
我是一名优秀的程序员,十分优秀!