如何在c主程序.cs中使用构造函数来注入接口



我是编程新手,我创建了一个名为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方法中使用接口,因为该方法是静态的。控制台应用程序默认情况下也不知道PointCalculatorIPointCalculator的实现。

您可以为此使用依赖注入,这是一种非常常见的模式。

它允许您执行以下操作:

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!
}
}

相关内容

  • 没有找到相关文章

最新更新