gpt4 book ai didi

c# - 需要交换具体类时的依赖注入(inject) C#

转载 作者:行者123 更新时间:2023-11-30 20:20:32 25 4
gpt4 key购买 nike

我打算写一个可以在多个项目之间使用的共享文件。

我的项目:

  1. 写代码吃冰淇淋。 (因为冰淇淋是我最喜欢的食物)。(请注意,我最喜欢的食物将来可能会变成芒果)
  2. 写代码吃芒果。 (因为芒果是我最喜欢的食物)。(请注意,我最喜欢的食物将来可能会变成冰淇淋)

界面如下

interface IEatFavoriteFood
{
void eat();
}

下面是我的具体类。

class EatMango
{
void eat()
{
// Some code to eat mango
}
}


class EatIceCream
{
void eat()
{
// Some code to eat ice cream
}
}

因此,我的两个项目需要分别有两个主程序,因为我将为 IEatFavoriteFood 接口(interface)初始化两个不同的具体类以调用 eat().

Main()
{
IEatFavoriteFood iff = new EatMango();
iff.eat();
}

Main()
{
IEatFavoriteFood iff = new EatIceCream();
iff.eat();
}

除此之外,如果将来某个时候第一个项目中最喜欢的食物变成了芒果,那么我将不得不重新编写初始化并重新编译我的项目。有没有更好的方法来实现这个功能。在这种情况下使用配置文件是否更有意义?

最佳答案

要使依赖注入(inject)起作用,您需要在某个地方列出具体类型,它知道要为可能的依赖项(接口(interface))插入哪个具体类。

在依赖注入(inject)框架中,这通常是通过某种配置完成的,通过代码或一些外部文件(例如一些 XML 配置)。

就您的目的而言,这可能是最简单的开始方式,只需拥有一些为您提供依赖项的“中心实体”。例如,这可以是 FavoriteFoodFactory:

public class FavoriteFoodFactory
{
public static IEatFavoriteFood GetFavoriteFood()
{
return new EatIceCream();
}
}

因此在您的 Main 中,您只需要求该工厂为您提供当前配置的任何喜欢的食物:

Main()
{
IEatFavoriteFood iff = FavoriteFoodFactory.GetFavoriteFood();
iff.eat();
}

当然,这只是将创建具体对象的责任转移到其他地方,但这正是依赖注入(inject)的重点。在最顶层有一些东西来处理如何解决依赖关系,从更下面的组件中移除需要知道的

关于c# - 需要交换具体类时的依赖注入(inject) C#,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36207104/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com