C# 派生具体类的依赖注入
希望这有意义: 我有两门课: 僵尸请求 请求 它们都必须注入依赖项: ICreatureRequest (其中包含ZombieRequest和LampieRequest必须使用的端点) 它们都源于抽象类: 请求 (其中包括ZombieRequest和VampieRequest的通用方法(验证从ICreatureRequest返回的响应)。还定义了如何将其用作API(成功变量、错误变量和sendRequest()方法))C# 派生具体类的依赖注入,c#,asp.net-mvc,architecture,C#,Asp.net Mvc,Architecture,希望这有意义: 我有两门课: 僵尸请求 请求 它们都必须注入依赖项: ICreatureRequest (其中包含ZombieRequest和LampieRequest必须使用的端点) 它们都源于抽象类: 请求 (其中包括ZombieRequest和VampieRequest的通用方法(验证从ICreatureRequest返回的响应)。还定义了如何将其用作API(成功变量、错误变量和sendRequest()方法)) 下面是它的伪代码: 僵尸请求:怪物请求 ~~使用ICreatureRequ
下面是它的伪代码: 僵尸请求:怪物请求 ~~使用ICreatureRequestAPI端点~~ ~~使用MonsterRequest方法验证响应~~ 请求:怪物请求 ~~使用ICreatureRequestAPI端点~~ ~~使用MonsterRequest方法验证响应~~
在我的控制器中,我想使用ZombieRequest和/或vampilerequest,但我不知道如何将它放在那里并使用它 我是否进行IMonstreRequest并将其注入控制器的构造函数中?但我如何使用僵尸请求或吸血鬼请求呢 控制器:
Get(string someVariable, string anotherVariable)
{
ZombieRequest z = new ZombieRequest();
if (z.SendRequest(someVariable, anotherVariable).Success)
string zombieData = z.ResponseData
}
僵尸请求:
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);
}
}
请求:
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”。有点困惑。好吧,这已经开始有意义了,所以我来尝试一下答案。您需要了解依赖项注入和依赖项注入框架(有时称为控制反转容器或IoC容器)之间的区别 您的请求和僵尸请求类被设置为允许依赖项注入。构造函数接受代码所需的依赖项。然而,您的控制器显然没有设置为依赖项注入,因为您正在更新一个请求 所以,专注于吸血鬼和僵尸类 首先,我建议您可以将ICreatureRequest在层次结构中上移到MonsterRequest中 更重要的是,为了使用依赖项注入并创建请求,您别无选择,只能先创建ICreatureRequest的实例。由于您正在控制器中进行更新,因此也必须在那里获取ICreatureRequest的实例 正如您所指出的,为什么控制器仅仅为了使用MonsterRequest就应该知道ICreatureRequest的特定实例?也许不应该。因此,您有几个选择:1)忽略此规则,让您的控制器创建ICreatureRequest。2) 将ICreatureRequest注入控制器。3) 将完全创建的请求注入控制器。4) 使用IoC容器自动为您创建所有依赖项
您已经明确表示不喜欢选项1的声音。如果使用选项2或3,您很快就会注意到需要有人更新ICreatureRequest以传递给控制器,因此您可能会在几个小时后回来。选项4可能是您的理解上的差距,以及几乎所有人都在谈论的依赖注入。这也是一个比我想在这里讨论的更大的主题,因此我只想让您参考我个人最喜欢的一个文档:查看代码会非常有帮助,很难将没有代码的情况下您想要做的事情上下文化。谢谢。我添加了一个代码示例,说明我希望如何在控制器中使用ZombieRequest接口的要点是控制器不关心您是否有ZombieRequest或ZombieRequest。接口应提供控制器所需的所有功能。通过传入zombie或Vampie请求对象,可以将ICreatureRequest传入控制器。您希望控制器了解ICreatureRequest而不是zombie请求。这样,您就可以在以后创建新的CreatureRequest类,而不必更改控制器。由于您奇怪的类名,这将导致通信错误。我期望通过请求和僵尸请求来实现ICreatureRequest。在控制器代码中,您正在“更新”一个僵尸请求。这不是依赖注入。您应该将请求注入控制器,而不是创建新的请求。