[英]how to instantiate a singleton class in Startup.cs and then use in net core?
[英]Instantiate a class object in startup.cs in .Net Core
我正在嘗試將接口和設置傳遞給 class,同時在.Net Core 項目中的 startup.cs 中創建該 class 的實例。 我正在使用下面的代碼來做到這一點。 我在 Student class 的構造函數中編寫了一些代碼,但是在啟動應用程序時,構造函數中的代碼/邏輯不起作用。 沒有錯誤,但調試指針未命中 Student class 的構造函數。
services.AddSingleton(c => new Student(settings, resourceSetting, c.GetService<IPersonService>()));
如果我使用下面的代碼,那么 Student 構造函數中的代碼工作正常。
Student studentHandler = new Student(settings, resourceSetting,);
services.AddSingleton<Student>(studentHandler);
但是我需要在構造函數中傳遞服務接口才能在啟動項目時做一些工作。 誰能幫我解決我在這里缺少的東西?
調試指針未命中 Student class 的構造函數
這是因為您在第一個片段中將類型注冊為實現工廠,使用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...");
}
}
output 是:
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>()
)。
您似乎正在使用依賴注入,因此我建議您根據您的構造函數進一步利用 DI 引擎。
首先,您需要注冊settings
和resourceSetting
對象
services.AddSingleton<Student>(settings);
services.AddSingleton<Student>(resourceSetting);
然后也注冊您的Student
class
services.AddSingleton<Student>();
現在,一旦您通過.BuildServiceProvider();
將ServiceCollection
構建到ServiceProvider
中; (如果你正在做一個控制台應用程序)你可以調用:
var myStudent = myServiceProvider.GetRequiredService<Student>();
如果您在 asp.net 之類的東西中執行此操作,那么您只需將您的Student
class 注入 controller 或其他此類服務以供消費
class MyController : ControllerBase
{
private Student Student { get; }
public MyController(Student student)
{
Student = student ?? throw new ArgumentNullException(nameof(student));
}
...
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.