gpt4 book ai didi

c# - 用更好的图案替换铸件

转载 作者:太空狗 更新时间:2023-10-29 23:31:13 25 4
gpt4 key购买 nike

我正在研究简单的客户端-服务器解决方案,客户端可以向服务器发送不同类型的命令并获得特定结果。命令可以具有不同的属性。我想要的是一种架构,可以根据它处理的命令类型选择特定的命令处理程序。我创建了如下基本基础设施:

public interface ICommand
{
}

public class CommandA: ICommand
{
public string CustomProperty { get; set; }
}

public class CommandB: ICommand
{
}

每个命令都有自己的CommandHandler,负责处理命令并返回结果。它们都继承自CommandHandlerBaseClass:

public interface ICommandHandler
{
bool CanHandle(ICommand command);
IReply Handle(ICommand command);
}

public abstract class CommandHandlerBase<TCommand> : ICommandHandler
where TCommand : class, ICommand
{
public bool CanHandle(ICommand command)
{
return command is TCommand;
}

public IReply Handle(ICommand command)
{
return Handle(command as TCommand);
}

public abstract IReply Handle(TCommand command);
}

// Specific handler
public class CommandAHandler : CommandHandlerBase<CommandA>
{
public override IReply Handle(CommandA command)
{
//handling command and returning result
return null;
}
}

我还创建了一个类负责选择合适的处理程序并返回结果:

public interface IReplyCreator
{
IReply GetReply(ICommand command);
}

public class ReplyCreator : IReplyCreator
{
private readonly IEnumerable<ICommandHandler> _commandHandlers;

public ReplyCreator(IEnumerable<ICommandHandler> commandHandlers)
{
_commandHandlers = commandHandlers;
}

public IReply GetReply(ICommand command)
{
var commandHandler = _commandHandlers
.FirstOrDefault(x => x.CanHandle(command));

if (commandHandler == null)
return null;
return commandHandler.Handle(command);
}
}

我不喜欢在 CommandHandlerBase 类中进行强制转换,但我找不到任何模式来避免它。我可以创建一个如下所示的通用接口(interface),但是如何在 ReplyCreator 中注册和选择特定的处理程序呢?

public interface ICommandHandler<TCommand>
where TCommand : ICommand
{
bool CanHandle(TCommand command);
IReply Handle(TCommand command);
}

服务器接收到的命令用Json.net序列化如下:

JsonConvert.SerializeObject(new CommandA(), new JsonSerializerSettings
{
TypeNameHandling = TypeNameHandling.All
};)

所以我收到一个字符串,最终需要将其反序列化为具体命令并由合适的处理程序处理。在这种情况下有没有办法完全避免类型转换?我使用 StructureMap 作为我的 IoC 库。

最佳答案

你为什么要避免这种转换?我现在想到的任何解决方法都不会比这更好。

为此,我会避免使用 as 关键字。当错误的类型传递给处理程序时,它会在不太可能的情况下静默失败。在这种情况下,您希望立即抛出异常,而不是稍后在代码中的某个地方抛出。

关于c# - 用更好的图案替换铸件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23708351/

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