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();
}