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

C# 需要交换具体类时的依赖项注入#,c#,C#,我计划在多个项目之间编写一个共享文件 我的项目: 编写吃冰淇淋的代码。(因为冰淇淋是我最喜欢的食物)。 (请注意,我最喜欢的食物将来可能会变成芒果) 编写吃芒果的代码。(因为芒果是我最喜欢的食物)。 (请注意,我最喜欢的食物将来可能会变成冰淇淋) 下面是界面 interface IEatFavoriteFood { void eat(); } 下面是我的具体课程 class EatMango { void eat() { // Some code to eat mango

我计划在多个项目之间编写一个共享文件

我的项目:

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

    interface IEatFavoriteFood
    {
        void eat();
    }
    
    下面是我的具体课程

    class EatMango
    {
      void eat()
      {
       // Some code to eat mango
      }
    }
    
    
    class EatIceCream
    {
      void eat()
      {
       // Some code to eat ice cream
      }
    }
    
    因此,我需要为我的两个项目分别设置两个主程序,因为我将为调用
    eat()
    IEatFavoriteFood
    接口初始化两个不同的具体类


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

    要使依赖项注入工作,您需要在某个位置列出具体类型,该位置知道为可能的依赖项插入哪个具体类(接口)

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

    出于您的目的,这可能是简单开始的最简单方法,简单地使用一些“中心实体”为您提供依赖项。例如,这可能是一个
    FavoriteFoodFactory

    public class FavoriteFoodFactory
    {
        public static IEatFavoriteFood GetFavoriteFood()
        {
            return new EatIceCream();
        }
    }
    
    因此,在您的
    Main
    中,您只需要求该工厂提供当前配置的喜爱的食物:

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

    当然,这只是将创建具体对象的责任转移到其他地方,但这正是依赖注入的重点。在最顶层有一些东西来处理如何解决依赖关系,这样就不需要进一步了解组件。

    我建议您使用IOC容器,如Autofac()、Ninject()或任何您最喜欢的容器。 容器将为您提供处理此类场景的不同方法。 例如,在Autofac中,您可以创建一个模块(该类包含容器将使用的具体类的注册),该模块可以通过web.config或代码加载/选择。 您可以在这里看到详细的文档和示例

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

    public class FavoriteFoodFactory
    {
        public static IEatFavoriteFood GetFavoriteFood()
        {
            return new EatIceCream();
        }
    }
    
    Main()
    {
        IEatFavoriteFood iff = FavoriteFoodFactory.GetFavoriteFood();
        iff.eat();
    }