我是编程新手,我创建了一个名为IPointCalculator
的接口,我在这个class
:中实现了它
public class PointCalculator : IPointCalculator
{
EnemisEntity enm = new EnemisEntity();
public int pointCal(string enemyType)
{
int point = 0;
if (enemyType == enm.banzai_Bill)
{
point = 200;
}
else if (enemyType == enm.beach_koopa)
{
point = 400;
}
else if (enemyType == enm.big_boo)
{
point = 800;
}
else if(enemyType==enm.blargg)
{
point = 1600;
}
return point;
}
}
现在在我的控制台应用程序中,我想使用它:
class Program
{
IPointCalculator _ipCal;
Program(IPointCalculator pntCal)
{
_ipCal = pntCal;
}
public static void Main(string[] args)
{
}
}
但是我不能在Main中使用_ipCal,我应该如何在这里使用它?这是正确的方式吗?
目标是将入口点(实际控制台应用程序(与您希望它执行的操作(PointCalculator(解开/松散耦合。
创建一个包装类(MyProgram(,以便注入实现。从那里,您可以查看更高级的选项,如使用依赖项注入工具。
class Program
{
public static void Main(string[] args)
{
var instance = new PointCalculator();
var program = new MyProgram(instance);
}
}
public class MyProgram
{
private readonly IPointCalculator _pointCalcuator;
public MyProgram(IPointCalculator pntCal)
{
_pointCalculator = pntCal;
}
}
不能在Main
方法中使用接口,因为该方法是静态的。控制台应用程序默认情况下也不知道PointCalculator
是IPointCalculator
的实现。
您可以为此使用依赖注入,这是一种非常常见的模式。
它允许您执行以下操作:
using Microsoft.Extensions.DependencyInjection;
class Program
{
static void Main(string[] args)
{
IServiceCollection services = new ServiceCollection();
Startup startup = new Startup();
startup.ConfigureServices(services);
IServiceProvider serviceProvider = services.BuildServiceProvider();
// entry to run app
serviceProvider.GetService<Runner>().Run();
}
}
public class Startup
{
public void ConfigureServices(IServiceCollection services)
{
services.AddTransient<IPointCalculator, PointCalculator>();
services.AddTransient<Runner>();
}
}
public class Runner
{
private readonly IPointCalculator _pointCalculator;
public Runner(IPointCalculator pointCalculator)
{
_pointCalculator = pointCalculator;
}
public void Run()
{
// I can use the point calculator!
}
}