我有一个Airport类,根据天气情况,飞机上的物体可以起飞和降落。如果是暴风雨,他们不能起飞/降落,如果是晴天,他们可以。我具有以下机场构造函数:
public string AirportName { get; set; }
public List<Plane> planes;
public Airport(string airportName)
{
planes = new List<Plane>();
AirportName = airportName;
Weather weather = new Weather();
}
我有一个Weather类,可以对天气进行随机化:
public class Weather
{
public Weather()
{
}
public string Forecast()
{
Random random = new Random();
var weather = random.Next(1, 11);
if (weather == 1 || weather == 2)
{
return "stormy";
}
else
{
return "sunny";
}
}
}
这就是我在Main使用机场的方式:
static void Main()
{
var gatwick = new Airport("London Gatwick");
}
由于天气信息是由单独的类提供的,因此我希望将其作为依赖项注入机场。但是,由于我是该语言的新手,所以我很难在C#中做到这一点。会是诸如public Airport(string airportName, Weather weather)
这样的东西吗?
如果有人可以帮助我理解如何作为依赖注入以及如何在Main中调用它,将非常感谢。谢谢!
答案 0 :(得分:1)
要回答有关依赖项注入的问题,那么您已经对了,您需要将Weather
对象传递给构造函数,以便实例化Airport
。然后,Weather
对象通常会存储在Weather
的{{1}}属性中。
但是,我认为在您的情况下,在Airport
中包含AirportWeatherManager
以及Airport
对象和控件的内容会更有意义行为。从语义上和概念上讲,机场要求天气存在是没有意义的。虽然通常会同时找到两者,但严格来说不需要才能使机场存在。此外,通过将“天气”设置为机场的财产,您可以将天气本身的控制权移交给机场,任何因暴风雨而导致航班延误的人都可以告诉您事实并非如此。
答案 1 :(得分:1)
我建议您使用诸如Ninject之类的依赖项注入库。
然后,您必须使用Dependency Resolver实例化您的类。
private readonly Weather weather;
public string AirportName { get; set; }
public List<Plane> planes;
public Airport(string airportName, Weather weather)
{
planes = new List<Plane>();
AirportName = airportName;
weather = weather;
}
然后在您的主要班级
IKernel kernel = new StandardKernel();
kernel.Bind<Airport>().
To<Airport>().
WithConstructorArgument("airportName", "Houston Airport");
var warrior = kernel.Get<Airport>();
或者,如果要在实例化时指定参数,请从上方删除“ WithConstructorArgument”并执行以下操作:
kernel.Get<Airport>( new ConstructorArgument( "airportName", "Houston Airport") );
答案 2 :(得分:0)
您在正确的轨道上。使构造函数将所有依赖项作为参数称为构造函数注入。只要有可能,首选此方法。 DI的另一种形式称为特性注入或场注入。仅当您要构造的对象是框架的一部分且需要它具有无参数构造函数时,才使用它。例如,Android中的Activity
必须具有无参数构造函数,因此Dagger 2之类的DI工具使用字段注入来设置公共字段。