【发布时间】:2019-08-29 09:55:15
【问题描述】:
我正在实施 CQRS 模式。为了在我的项目中使用 CQRS 模式,我编写了三个命令,它们是
public class DogCommand : PetCommand
{
public DogCommand(){}
public override string Name{get; set;}
}
public class CatCommand : PetCommand
{
public CatCommand(){}
public override string Name{get; set;}
}
public abstract class PetCommand : ICommand
{
public PetCommand(){}
public virtual string Name{get; set;}
}
public interface ICommand
{
//Business logic
}
这里我有一个名为ICommand 的接口。 PetCommand 是实现此接口的基类。派生类DogCommand 和CatCommand 继承PetCommand。
我还写了基本的命令处理程序,如下所示
public abstract class BaseCommandHandler<T> : CommandHandler<T> where T : ICommand
{
protected BaseCommandHandler(string type, string name): base(type, name)
{
}
}
public abstract class CommandHandler<T> : ICommandHandler<T> where T : ICommand
{
protected CommandHandler(string type, string name)
{
//Business logic
}
protected void LogWrite(T command)
{
//Writing log
}
}
public interface ICommandHandler<in T> where T : ICommand
{
void Run(T command);
}
BaseCommandHandler 中存在的所有函数,我将在每个派生的命令处理程序中使用
现在问题出在派生类命令处理程序中
public class PetCommandHandler : BaseCommandHandler<DogCommand>, ICommandHandler<CatCommand>
{
public void Run(DogCommand dCommand)
{
this.LogWrite(dCommand)
}
public void Run(CatCommand cCommand)
{
**//Want to access this.LogWrite() with cCommand. How can I do that?**
}
}
这里我无法访问 cCommand 的 this.LogWrite() 函数,因为 PetCommandHandler 正在继承 first BaseCommandHandler 和 then 实现 ICommandHandle。
cCommand如何访问
this.LogWrite()函数?
这是编译时错误:
无法从“Command.DogCommand”转换为“Command.CatCommand”
更新:
解决此问题的第一种方法:
我可以通过使用基本命令来解决此问题,即 BaseCommandHandler 中的 PetCommand 而不是 DogCommand。这将帮助我访问 this.LogWrite() 函数中的所有派生类,但这将导致我实现空的 Run(PetCommand petCommand) {} 函数,这是我不想做的。
第二种方式:
每当我遇到这种情况时,我都可以将 CommandHandler 和 override 中的 virtual 功能更改为 virtual。
如果有人为此问题提供任何其他解决方案,我真的很感激。
【问题讨论】:
-
PetCommandHandler试图拥有两个宠物类型,为什么? -
嗯,这里没有显示
LogWrite的重载,它接受DogCommand或CatCommand。 -
看起来您正在尝试“伪造”多重继承。我只需创建一个
DogCommandHandler和一个CatCommandHandler。 -
@ChetanRanpariya,是的,因为
PetCommandHandler将支持所有PetCommands。我不能为从PetCommand删除的每个命令编写单独的命令处理程序。 -
是的,写
PetCommandHandler以获取PetCommand。
标签: c# inheritance design-patterns cqrs