Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/316.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 来自控制台应用程序中主方法的DI_C#_.net Core - Fatal编程技术网

C# 来自控制台应用程序中主方法的DI

C# 来自控制台应用程序中主方法的DI,c#,.net-core,C#,.net Core,我有一节课 public class A { public A(IB b) { } public void Method1() { } } 类程序 { 静态void Main(字符串[]参数) { var serviceProvider=newservicecolection() .AddSingleton() .BuildServiceProvider(); //如何调用classA的Method1 classA=新classA(); }

我有一节课

public class A
{
    public A(IB b)
    {
    }

    public void Method1()
    {
    }
}

类程序
{
静态void Main(字符串[]参数)
{
var serviceProvider=newservicecolection()
.AddSingleton()
.BuildServiceProvider();
//如何调用classA的Method1
classA=新classA();
}
}
如何从
Main
方法调用
Method1()


我得到一个编译时错误,因为“不存在重载方法”。

您还需要注册
a
,然后使用服务提供商获取实例。服务提供商将向您的
A
实例中注入
IB

static void Main(string[] args)
{
    var serviceProvider = new ServiceCollection()
        .AddSingleton<IB,B>()
        .AddSingleton<A>()
        .BuildServiceProvider();

    var a = serviceProvider.GetService<A>();
    a.Method1();
 }
static void Main(字符串[]args)
{
var serviceProvider=newservicecolection()
.AddSingleton()
.AddSingleton()
.BuildServiceProvider();
var a=serviceProvider.GetService();
a、 方法1();
}

应用程序中的DI需要在某个地方引导。例如,在ASP.NET中,这种情况发生在框架内,“看不见”

在这里,您必须注册并解析A类:

 static void Main(string[] args)
 {
     var serviceProvider = new ServiceCollection()
        .AddSingleton<IB,B>()
        .AddTransient<A>()     // Transient or Singleton, it depends
        .BuildServiceProvider();

    //How to call Method1 of classA
    // classA a = new classA(); 

    var a  = serviceProvider.GetRequiredService<A>();
 }
static void Main(字符串[]args)
{
var serviceProvider=newservicecolection()
.AddSingleton()
.AddTransient()//瞬态或单例,具体取决于
.BuildServiceProvider();
//如何调用classA的Method1
//classA=新classA();
var a=serviceProvider.GetRequiredService();
}

要在控制台应用程序中具有依赖注入功能,请确保在项目中包含Microsoft.Extensions.DependencyInjection

我猜你在找这样的东西:

public class A
{
    public A(IB b)
    {
    }

    public void Method1()
    {
    }
}

public interface IB
{
}

public class B : IB
{
}

public class Program
{
    public static void Main(string[] args)
    {
        var serviceProvider = new ServiceCollection()
           .AddSingleton<IB, B>()
           .BuildServiceProvider();

        //How to call Method1 of classA
        var a = ActivatorUtilities.CreateInstance<A>(serviceProvider);

        a.Method1();
    }
}
公共A类
{
公共A(IB b)
{
}
公共无效方法1()
{
}
}
公共接口IB
{
}
B级:IB
{
}
公共课程
{
公共静态void Main(字符串[]args)
{
var serviceProvider=newservicecolection()
.AddSingleton()
.BuildServiceProvider();
//如何调用classA的Method1
var a=ActivatorUtilities.CreateInstance(serviceProvider);
a、 方法1();
}
}

您必须将所有类添加到您的服务提供商(似乎您没有添加
classA
)。然后要获取实例,必须调用
var a=serviceProvider.GetRequiredService()
如果该类包含对
B
的依赖项,则将创建并注入该类。我们不知道类型
classA
是否具有名为
Method1
的方法,因为您没有向我们显示类型
classA
的定义。您向我们展示了类
A
的定义,但这与
classA
不同。请注意,.NET和ASP.NET标记指的是.NET Framework,而不是.NET Core,因此添加它们会使您的问题变得不那么清楚。另外,您的问题通常与.NET Core有关,而不是特别与ASP.NET Core(web framework)有关,因此我已为您更改了标记。您可以将DI作为包添加到控制台应用程序中。谢谢,您是对的。我更正了答案。您是否可以添加一些关于使用
ActivatorUtilities
而不是简单地使用
serviceProvider.GetRequiredService()
?这取决于您想对实例执行什么操作。如果您使用CreateInstance,您可以完全控制生命周期,您可以随时创建和销毁它,而垃圾收集将在不再需要时进行清理。此外,您不必关心控制是创建新实例还是重用现有实例的范围。如果A类实现了代码不同位置所需的服务,并且应该保持活动状态并重复使用,则应将其注册为服务;否则我只会创建实例。不是真的,你可以使用ActivatorUtilities.CreateInstance来解析构造函数参数。是的,这也可以。我只是在我需要的少数情况下总是使用这种模式。我确实认为CreateInstance属于较低级别,供DI内部使用。但是它是公开的,我相信它有一些使用案例。如果你不想通过依赖注入来使用它,那么注册它是没有意义的。您只需创建下面我的答案中所示的实例。当然。。。。您也可以只编写
newa(newb())
并完全跳过服务提供商。不知何故,我认为这违背了演习的目的。
public class A
{
    public A(IB b)
    {
    }

    public void Method1()
    {
    }
}

public interface IB
{
}

public class B : IB
{
}

public class Program
{
    public static void Main(string[] args)
    {
        var serviceProvider = new ServiceCollection()
           .AddSingleton<IB, B>()
           .BuildServiceProvider();

        //How to call Method1 of classA
        var a = ActivatorUtilities.CreateInstance<A>(serviceProvider);

        a.Method1();
    }
}