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();
}
}