派生具体类的依赖注入

时间:2017-11-16 17:58:14

标签: c# asp.net-mvc architecture

希望这是有道理的:

我有两个班级:

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'。有点困惑。

1 个答案:

答案 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