在.NetCore中的startup.cs中实例化一个类对象
c#
我正在尝试将接口和设置传递给一个类,同时在 .Net Core 项目的 startup.cs 中创建该类的实例。我正在使用下面的代码来做到这一点。我在 Student 类的构造函数中编写了一些代码,但是在启动应用程序时,构造函数中的代码/逻辑不起作用。没有错误,但调试指针没有命中 Student 类的构造函数。
services.AddSingleton(c => new Student(settings, resourceSetting, c.GetService<IPersonService>()));
如果我使用下面的代码,那么 Student 构造函数中的代码工作正常。
Student studentHandler = new Student(settings, resourceSetting,);
services.AddSingleton<Student>(studentHandler);
但是我需要在构造函数中传递 Service 接口才能在启动项目时做一些工作。任何人都可以帮助我解决我在这里缺少的东西吗?
回答
调试指针未命中 Student 类的构造函数
那是因为您在第一个片段中将类型注册为实现工厂,使用AddSingleton<TService> (this IServiceCollection services, Func<IServiceProvider,TService> implementationFactory)此方法,在解决依赖关系之前Student不会调用实现工厂委托(以及随后的构造函数)。
在第二个代码段中,您在服务注册时直接实例化类型并将该实例添加到服务集合中AddSingleton<TService> (this IServiceCollection services, TService implementationInstance)。
这是一个示例,其中包含解释每种方法中每个步骤的日志:
class Program
{
static void Main(string[] args)
{
RegisterImplementationFactory();
RegisterImplementation();
}
static void RegisterImplementationFactory()
{
Console.WriteLine("RegisterImplementationFactory ------------");
var services = new ServiceCollection();
Console.WriteLine("Registering Student...");
services.AddSingleton(c => new Student());
Console.WriteLine("Student registered.");
Console.WriteLine("Building ServiceProvider...");
var serviceProvider = services.BuildServiceProvider();
Console.WriteLine("ServiceProvider built.");
Console.WriteLine("Resolving Student...");
Student student = serviceProvider.GetService<Student>();
Console.WriteLine("Student resolved.");
Console.WriteLine("RegisterImplementationFactory ------------");
Console.WriteLine();
}
static void RegisterImplementation()
{
Console.WriteLine("RegisterImplementation ------------");
var services = new ServiceCollection();
Console.WriteLine("Registering Student...");
Student studentToRegister = new Student();
services.AddSingleton(studentToRegister);
Console.WriteLine("Student registered.");
Console.WriteLine("Building ServiceProvider...");
var serviceProvider = services.BuildServiceProvider();
Console.WriteLine("ServiceProvider built.");
Console.WriteLine("Resolving Student...");
Student student = serviceProvider.GetService<Student>();
Console.WriteLine("Student resolved.");
Console.WriteLine("RegisterImplementation ------------");
Console.WriteLine();
}
}
class Student
{
public Student()
{
Console.WriteLine("!!! Instantiating Student...");
}
}
这个的输出是:
RegisterImplementationFactory ------------
Registering Student...
Student registered.
Building ServiceProvider...
ServiceProvider built.
Resolving Student...
!!! Instantiating Student...
Student resolved.
RegisterImplementationFactory ------------
RegisterImplementation ------------
Registering Student...
!!! Instantiating Student...
Student registered.
Building ServiceProvider...
ServiceProvider built.
Resolving Student...
Student resolved.
RegisterImplementation ------------
有了这个,您可以清楚地看到,在使用工厂委托进行注册时,在Student解析类型之前不会调用构造函数(GetService<Student>()在这种情况下)。