希望这是有道理的:
我有两个班级:
ZombieRequest
VampireRequest
他们都必须依赖注入:
ICreatureRequest (其中包含 ZombieRequest 和 VampireRequest 必须使用的端点)
它们都来自抽象类:
MonsterRequest (其中包括 ZombieRequest & VampireRequest 的常用方法(验证从 ICreatureRequest 发回的响应)。还定义了应如何使用它作为API(成功变量,错误变量和sendRequest()方法))
这就像它看起来的伪代码:
ZombieRequest : MonsterRequest
~~使用 ICreatureRequest API端点~~
~~使用 MonsterRequest 方法验证响应~~
VampireRequest : MonsterRequest
~~使用 ICreatureRequest API端点~~
~~使用 MonsterRequest 方法验证响应~~
在我的控制器中,我想使用 ZombieRequest 和/或 VampireRequest ,但我迷失了如何实际使用它并使用它。
我是否制作了一个IMonsterRequest并将其注入控制器的构造函数中?但那我如何使用ZombieRequest或VampireRequest呢?
控制器:
Get(string someVariable, string anotherVariable)
{
ZombieRequest z = new ZombieRequest();
if (z.SendRequest(someVariable, anotherVariable).Success)
string zombieData = z.ResponseData
}
ZombieRequest:
class ZombieRequest : MonsterRequest
{
ICreatureRequest m_CreatureRequest;
public ZombieRequest(ICreatureRequest c)
{
m_CreatureRequest = c;
}
public MakeRequest(someVar, anotherVar)
{
var response = m_CreatureRequest.GetZombie(someVar, anotherVar);
ValidateAndSetResponseData(response);
}
}
MonsterRequest:
abstract class MonsterRequest
{
public bool Success;
public string Data;
public abstract MakeRequest(someVar, anotherVar);
public void ValidateAndSetResponseData(var response)
{
// read response and:
// set Success
// set Data
}
}
但显然我制作对象时仍然需要提供'ICreatureRequest'。有点困惑。
答案 0 :(得分:1)
好的,这已经开始变得有意义,所以我会在答案中采取行动。您需要了解依赖注入和依赖注入框架(有时称为控制容器或IoC容器的反转)之间的区别。
您的VampireRequest和ZombieRequest类已设置为允许依赖注入。构造函数接受代码所需的依赖项。但是,您的控制器显然没有设置依赖注入,因为您正在新建请求。
所以,专注于吸血鬼和僵尸课程。
首先,我建议你可以将层次结构中的ICreatureRequest移到MonsterRequest中。
更重要的是,为了使用依赖注入并创建VampireRequest,您别无选择,只能先创建一个ICreatureRequest实例。由于您在控制器中进行了新操作,因此您必须在那里获得ICreatureRequest的实例。
正如您所知,为什么控制器应该知道ICreatureRequest的特定实例才能使用MonsterRequest?它可能不应该。所以你有几个选择:1)忽略这个规则,让你的控制器创建ICreatureRequest。 2)将ICreatureRequest注入控制器。 3)将完全创建的MonsterRequest注入控制器。 4)使用IoC容器自动为您创建所有依赖项。
你已经明确表示你不喜欢选项1的声音。如果你选择2或3选项,你很快就会注意到有人需要新建ICreatureRequest以传递给Controller,所以你可能会在几个小时后回来。选项4可能是你理解中的差距,而且当他们说依赖注入时,每个人都在谈论它。这也是一个比我想要在这里提到的更大的主题,所以相反我只会引用你的个人收藏的文档:https://simpleinjector.readthedocs.io/en/latest/index.html