在我的项目中,编写了一个通用的服务解析器类方法.其中公共方法返回<IServiceA、IServiceB、IServiceC&>之一.我无法嘲笑这种班级行为.

private readonly IServiceA _serviceA;
private readonly IServiceB _serviceB;
private readonly IServiceC _serviceC;

public ProjectResolver(
    IServiceA serviceA,
    IServiceB serviceB,
    IServiceC serviceC
)
{
    _serviceA = serviceA;
    _serviceB = serviceB;
    _serviceC = serviceC;
}

...

public OneOf<IServiceA, IServiceB, IServiceC> GetServiceHandler(string Id)
{
    if (!_projectSettings.Projects.ContainsKey(Id))
        return new NotFound();

    return _projectSettings.Projects[Id] switch
    {
        "a" => (ServiceA)_serviceA,
        "b" => (ServiceB)_serviceB,
        "c" => (ServiceC)_serviceC,
        _ => throw new ArgumentOutOfRangeException(Id)
    };
}

我模拟了所有服务(IServiceA、IServiceB和IServiceC)和项目解析器类.在运行测试时,我出现异常情况.

Exception while calling Path
System.InvalidCastException: Unable to cast object of type 'Castle.Proxies.IserviceA' to type 'ServiceA'.

我需要帮助来嘲笑这个项目解析器类.提前感谢👍

推荐答案

模仿与否--无论如何都不应该强制转换为显式的服务实现."手动"创建OneOf个:

return _projectSettings.Projects[Id] switch
{
    "a" => OneOf<IServiceA, IServiceB, IServiceC>.FromT0(_serviceA),
    "b" => OneOf<IServiceA, IServiceB, IServiceC>.FromT1(_serviceB),
    "c" => OneOf<IServiceA, IServiceB, IServiceC>.FromT2(_serviceC),
    _ => throw new ArgumentOutOfRangeException(Id)
};

Csharp相关问答推荐

ASP.NET MVC购物车数量更新并从购物车中删除项目

try 在Blazor项目中生成html

如何在C#中使用正则表达式抓取用逗号分隔的两个单词?

Blazor WebApp:原始异常:AADSTS700025:客户端是公共的,因此既不应显示客户端,也不应显示客户端

如何使用新的Microsoft.IdentityModel.JsonWebToken创建JwtSecurityToken?

为什么在使用动态obj+类obj时会调用串联?

如何在ASP.NET Core8中启用REST应用程序的序列化?

在C#中反序列化/序列化具有混合元素顺序的XML时出现问题

如何将端点(或с匹配请求并判断其路径)添加到BCL?

异步等待Foreach循环中的ConfigureAWait(FALSE)执行什么操作?

用C#从XML内部元素中获取特定值

将FileStream的特定部分作为字节数组读取

为什么我的用户界面对象移动到略低于实际目标?

在构造函数中传递C#函数以用作EventHandler委托的订阅服务器

使用postman 测试配置了身份的.NET 6应用程序

使用ITfoxtec.Identity.Saml2解析相同键多值SAML 2声明

将文本从剪贴板粘贴到RichTextBox时,新文本不会在RichTextBox ForeColor中着色

我想我必须手动使用res1(字符串形式的PowerShell哈希表)

从具有泛型类型约束的类继承-Blazor

更新实体框架上的被跟踪实体