我最近询问了循环依赖性。答案是要在接口(MyProject.Abstractions
)上专用一个项目。现在,该项目是另一个具有访问者模式的循环依赖的原因。
namespace MyProject.Abstractions
{
public interface ICharacter { }
public interface ICharacterVisitor
{
// References MyProject.Characters
void Visit(Warrior warrior);
void Visit(Wizard wizard);
}
}
namespace MyProject.Characters
{
// References MyProject.Abstractions
public abstract class CharacterBase : ICharacter { }
public class Warrior : CharacterBase { }
public class Wizard : CharacterBase { }
}
这是否意味着我的ICharacterVisitor应该在我的MyProject.Characters
项目中?我将整个解决方案奉为我的SOLID培训练习。
答案 0 :(得分:1)
访问者是一种适用于现有结构但不是其一部分的工具。因此,我会将访问者与您要访问的数据分开。
"min_gram": "2"
"max_gram": "6"
namespace MyProject.Abstractions.Characters
{
public interface ICharacter { }
}
using MyProject.Abstractions.Characters;
namespace MyProject.Characters
{
public abstract class CharacterBase : ICharacter { }
public class Warrior : CharacterBase { }
public class Wizard : CharacterBase { }
}
using MyProject.Abstractions.Characters;
using MyProject.Characters;
namespace MyProject.Abstractions.Visitors
{
public interface ICharacterVisitor
{
// References MyProject.Characters
void Visit(Warrior warrior);
void Visit(Wizard wizard);
}
}
您不必为每个命名空间都拥有一个单独的项目。访客内容可能与using MyProject.Abstractions.Characters;
using MyProject.Abstractions.Visitors
using MyProject.Characters;
namespace MyProject.Visitors
{
// Concrete visitors here
}
在同一项目中。 SOLID是关于逻辑的代码组织,而不是物理的代码。对benefits of multiple Projects and One Solution的回答列出了拥有多个项目的充分理由。
答案 1 :(得分:0)
从本质上讲,访问者模式确实倾向于引入循环依赖性-访问者接口必须知道其操作的所有不同类,并且每个接口都必须以某种方式知道如何在访问者上调用正确的方法,这意味着了解访问者的班级。
您可以通过执行以下操作来打破这种循环依赖性:
x
假设您实际上需要“ CharacterBase”类来容纳字符之间的某种共享功能/属性。
由于“访问者”模式的本质是真正的问题,因此您是否必须拨打电话是否值得-将来您添加更多字符类型的可能性有多大?您增加更多访客的可能性是多少?您有什么方法可以让每种类型的角色自己决定在特定情况下需要采取的行动?