我打算在两个项目之间编写一个共享文件。
我的项目:
以下是界面
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,那么我将不得不重新编写初始化并重新编译我的项目。有没有更好的方法来实现此功能。在这种情况下使用配置文件更合理吗?
答案 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容器非常简单,但在大多数情况下,您必须了解组件的生命周期,以避免可能出现的问题和内存泄漏。