C# - 尝试为不同的处理程序返回泛型类型 T

C# - Trying to return a generic type T for different handlers

提问人:J Moss 提问时间:8/25/2023 最后编辑:J Moss 更新时间:8/25/2023 访问量:68

问:

目标:

  1. 在 Program.cs 中,我调用不同的命令处理程序,但我希望它们返回 - 因此每个命令处理程序都可以返回自己的类型 TCustomerResponse<T>

客户响应:

public class CustomerResponse<T>
{
    public T Response { get; set; } // so other handlers can return their own response
}

ICommandHandler:

public interface ICommandHandler
{
    CustomerRespone<T> Handle<T>(T details);
}

命令处理程序:

public interface CustomerCommandHandler : ICommandHandler
{
    // injecting our service in ctor

    public CustomerResponse<T> Handle<T>(T details)
    {
        // result is of type CustomerResponse<Operation> but we can't return directly
        // because it can't be implicitly casted to CustomerResult<T>
        var result = _customerService.CustomerOperation(details);
        
        // doesn't do what i expect it to do at runtime
        return (CustomerResponse<T>)(object)result;
    }
}

程序.cs:

var result = _customerHandler.Handle(CustomerDetails details);

问题:

  • 程序.cs中的结果类型将是CustomerDetails
  • 所以我会得到一个 type 的转换错误CustomerResponse<Operation>CustomerResponse<CustomerDetails>
  • 我们想回来CustomerResponse<Operation>

这样我们就可以有多个处理程序,这些处理程序可以返回自己的 CustomerResponse

C# 泛型转换

评论

0赞 J Moss 8/25/2023
也许我需要重新考虑设计?(虽然哈哈,但对我来说似乎是可能的)
0赞 Ralf 8/25/2023
然后给 Handle 方法两个泛型参数,当 in Type 和 out Type 不同时?
1赞 Ralf 8/25/2023
也许详细说明一下您要在此处返回的类型。您刚刚在此处输入了类的名称操作,但有了更多详细信息,有人可能会有更好的主意。
0赞 J Moss 8/25/2023
我想返回 CommandResponse<Operation>这是服务为此特定处理程序返回的内容。但由于每个处理程序都有不同的参数 Type 和 return Type.。我认为在我的场景中,它返回参数 Type...即 CustomerDetails
1赞 Sancho Panza 8/25/2023
根本问题?恕我直言,“CustomerResponse<U> Handle<T, U>(T details)”类型的接口在 CQRS 模式中很常见,并且没有任何设计问题的迹象。

答:

-1赞 Georg 8/25/2023 #1

你的接口只指定了一件事:每当你输入一个类型的东西时,你都会得到一个 类型的响应。如果您的实现想要接收一个对象并创建一个 ,则它无法实现此接口。ICommandHandlerTCustomerReponse<T>CustomerDetailsCustomerResponse<Operation>

在我看来,返回类型似乎确实取决于您实际执行的命令类型,因此,您不能创建单个接口作为保护伞。要执行后者,您必须转到更通用的命令模式。