需要交换具体类时的依赖注入C#

时间:2016-03-24 18:07:09

标签: c#

我打算在两个项目之间编写一个共享文件。

我的项目:

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

    interface IEatFavoriteFood
    {
        void eat();
    }
    

    以下将是我的具体课程。

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

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

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

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

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

2 个答案:

答案 0 :(得分:4)

为了使依赖注入工作,你需要一些列出具体类型的地方,它知道要插入哪个具体类以获得可能的依赖关系(接口)。

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

出于您的目的,它可能是最简单的方法,只需要一些“中心实体”来为您提供依赖关系。例如,这可以是FavoriteFoodFactory

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

所以在你的Main中,你会问工厂给你当前配置的最喜欢的食物:

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

当然,只是将责任转移到创建具体对象到其他地方,但这正是依赖注入的重点。要在最顶层处理如何解决依赖关系的问题,请从组件中删除需要知道

答案 1 :(得分:2)

我建议你使用像Autofac(http://autofac.org/),Ninject(http://www.ninject.org/)或你最喜欢的任何IOC容器。 容器将为您提供处理这种情况的不同方法。 例如,在Autofac中,您可以创建一个模块(这是一个包含容器将使用的具体类的注册的类),可以通过web.config或代码加载/选择。 您可以在此处查看详细的文档和示例 http://docs.autofac.org/en/latest/configuration/modules.html

请注意,使用IOC容器非常简单,但在大多数情况下,您必须了解组件的生命周期,以避免可能出现的问题和内存泄漏。