Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-mvc/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 派生具体类的依赖注入_C#_Asp.net Mvc_Architecture - Fatal编程技术网

C# 派生具体类的依赖注入

C# 派生具体类的依赖注入,c#,asp.net-mvc,architecture,C#,Asp.net Mvc,Architecture,希望这有意义: 我有两门课: 僵尸请求 请求 它们都必须注入依赖项: ICreatureRequest (其中包含ZombieRequest和LampieRequest必须使用的端点) 它们都源于抽象类: 请求 (其中包括ZombieRequest和VampieRequest的通用方法(验证从ICreatureRequest返回的响应)。还定义了如何将其用作API(成功变量、错误变量和sendRequest()方法)) 下面是它的伪代码: 僵尸请求:怪物请求 ~~使用ICreatureRequ

希望这有意义:

我有两门课:

僵尸请求

请求

它们都必须注入依赖项:

ICreatureRequest (其中包含ZombieRequest和LampieRequest必须使用的端点)

它们都源于抽象类:

请求 (其中包括ZombieRequest和VampieRequest的通用方法(验证从ICreatureRequest返回的响应)。还定义了如何将其用作API(成功变量、错误变量和sendRequest()方法))


下面是它的伪代码:

僵尸请求:怪物请求

~~使用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。在控制器代码中,您正在“更新”一个僵尸请求。这不是依赖注入。您应该将请求注入控制器,而不是创建新的请求。