gpt4 book ai didi

c# - 具有通用处理程序和查询的 Mediatr

转载 作者:行者123 更新时间:2023-12-04 13:40:51 27 4
gpt4 key购买 nike

我正在使用 Mediatr 开发 ASP.NET Core 2.2 Web API 应用程序。

我有一个看起来像的处理程序 -

public class MyQueryHandler<T> : IRequestHanlder<MyQuery<T>, IQueryable<T>>
{
public Task<IQueryable<T>> Handle(MyQuery<T> myquery, CancellationToken cancellationToken)
{
//perform query

IQueryable<T> models = someDatabaseQuery.ProjectTo<T>();
}
}

这是查询 -
public class MyQuery<T> : IRequest<IQueryable<T>>
{
//some properties
}

当我尝试提出这样的请求时 -
var result = await _mediator.Send(new MyQuery<SomeModel> {/* set the properties on the query */})

我得到一个异常(exception) -
An unhandled exception occurred while processing the request.

InvalidOperationException: Handler was not found for request of type MediatR.IRequestHandler`2[MyQuery`1[SomeModel],System.Linq.IQueryable`1[SomeModel]]. Register your handlers with the container. See the samples in GitHub for examples.

我花了好几个小时尝试了很多东西,但都没有奏效。按照 Mediator github repo 中提供的示例,我什至厌倦了将 Autofac 与服务集合一起使用。

最佳答案

每个 Query 都应该有一个具体的类型/平面结构,以便它的处理程序可以在运行时由依赖注入(inject)容器轻松注册。我相信注册通用查询处理程序作为示例是不可能的,因为 DI 容器在注册通用类型方面可能存在问题。
我相信创建一个 Behavior是你应该做的正确的事情。它可以让您在一个地方处理所有查询或命令,因此您可以在点击给定 Query 的处理程序之前运行一些额外的/通用逻辑,例如日志记录等。/Command .

编辑

In the handler I use automapper projections to limit what is queried from the db table in question. The lets the caller tell query and in turn the handler the shape of data wanted.



为了限制从数据库查询的内容,我将使用一种为每个实体创建查询和查询处理程序的方法。我认为有这样的分离是有意义的,因为从安全角度来看,您可能只想授予特定用户组的访问权限以运行给定的查询。

因此,例如 Order实体看起来像。
public class OrderDto
{
public string Name { get; set; }

public int Amount { get; set; }
}

public class FilterOrdersQuery : IRequest<List<OrderDto>>
{
public string Filter { get; set; }
}

public class FilterOrdersQueryHandler : IRequestHandler<FilterOrdersQuery, List<OrderDto>>
{
public Task<List<OrderDto>> Handle(FilterOrdersQuery notification, CancellationToken cancellationToken)
{
var dataSource = new List<OrderDto>(){
new OrderDto()
{
Name = "blah",
Amount = 65
},
new OrderDto()
{
Name = "foo",
Amount = 12
},
};

var result = dataSource
.Where(x => x.Name.Contains(notification.Filter))
.ToList();

return Task.FromResult(result);
}
}

这只是一个简单的例子,展示了如何过滤给定的实体并返回过滤对象的列表。您还可以为分页、OrderBy 等添加逻辑。

关于c# - 具有通用处理程序和查询的 Mediatr,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57504374/

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