C# 如何使用.NET Core';s使用服务结构进行内置依赖项注入
下午好 我最近开始尝试使用ServiceFabric和.NETCore。 我创建了一个无状态Web API,并使用以下工具执行了一些DI:C# 如何使用.NET Core';s使用服务结构进行内置依赖项注入,c#,.net-core,azure-service-fabric,C#,.net Core,Azure Service Fabric,下午好 我最近开始尝试使用ServiceFabric和.NETCore。 我创建了一个无状态Web API,并使用以下工具执行了一些DI: public void ConfigureServices(IServiceCollection services) { services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_2); var connString = Configuration.Get
public void ConfigureServices(IServiceCollection services)
{
services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_2);
var connString = Configuration.GetConnectionString("DefaultConnection");
services.AddScoped<FaxLogic>();
services.AddDbContext<ApplicationContext>(options => options.UseSqlServer(connString));
}
然后,我创建了一个非WebAPI无状态服务。我希望能够像在WebAPI中一样访问FaxLogic和DbContext,但要使用无状态服务的RunAsync方法:
protected override async Task RunAsync(CancellationToken cancellationToken)
{
// TODO: Replace the following sample code with your own logic
// or remove this RunAsync override if it's not needed in your service.
while (true)
{
cancellationToken.ThrowIfCancellationRequested();
ServiceEventSource.Current.ServiceMessage(this.Context, "Hello!");
// do db stuff here!
await Task.Delay(TimeSpan.FromSeconds(5), cancellationToken);
}
}
我想知道我会怎么做。我尝试使用CreateServiceInstanceListeners()方法和使用ServiceRuntime注册的Program.cs文件,但我似乎无法理解!任何帮助都将不胜感激。TaeSeo
我想你正在寻找的是在我的工作项目实施-
在CoherentSolutions.Extensions.Hosting.ServiceFabric方面,您需要的是:
private static void Main(string[] args)
{
new HostBuilder()
.DefineStatelessService(
serviceBuilder => {
serviceBuilder
.UseServiceType("ServiceName")
.DefineDelegate(
delegateBuilder => {
delegateBuilder.ConfigureDependencies(
dependencies => {
dependencies.AddScoped<FaxLogic>();
});
delegateBuilder.UseDelegate(
async (StatelessServiceContext context, FaxLogic faxLogic) => {
while (true) {
cancellationToken.ThrowIfCancellationRequested();
ServiceEventSource.Current.ServiceMessage(context, "Hello!");
await Task.Delay(TimeSpan.FromSeconds(5), cancellationToken);
});
})
})
.Build()
.Run();
}
private static void Main(字符串[]args)
{
新主机生成器()
.DefineStatelessService(
serviceBuilder=>{
服务建设者
.UseServiceType(“服务名称”)
.被定义的遗赠人(
delegateBuilder=>{
delegateBuilder.ConfigureDependencies(
依赖项=>{
dependencies.addScope();
});
delegateBuilder.UseDelegate(
异步(无状态ServiceContext上下文,FaxLogic FaxLogic)=>{
while(true){
cancellationToken.ThrowIfCancellationRequested();
ServiceEventSource.Current.ServiceMessage(上下文“Hello!”);
等待任务延迟(TimeSpan.FromSeconds(5),cancellationToken);
});
})
})
.Build()
.Run();
}
如果你有更多的问题,请随时询问或检查该项目
希望有帮助。解决方案已在此处得到解答: 总之,在创建无状态服务的新实例之前,必须先注册依赖项,然后再创建工厂方法来解析依赖项: i、 e:
公共静态类程序
{
公共静态void Main(字符串[]args)
{
var provider=newservicecolection()
.AddLogging()
.AddSingleton()
.AddSingleton()
.BuildServiceProvider();
ServiceRuntime.RegisterServiceAsync(“MyServiceType”,
context=>newmyservice(context,provider.GetService());
}).GetAwaiter().GetResult();
有关更多详细信息,请参阅链接的答案。Hello Diego的可能副本!感谢您的回答!在API的Startup.cs文件中,我可以访问IConfiguration接口,从加载的AppSettings.json获取连接字符串。如果我想要.adddbcontent,我将如何对Program.cs中的DbContext执行类似操作xt?啊,没关系,我已经解决了这个问题。很抱歉,我看得不够仔细,有点困惑。谢谢你的帮助!@Diego Mendes我对你的回答有点困惑。提供商不应该注册所有DI,然后将其传递给服务类吗?在你的代码片段中,为什么要传递provider.GetService而不是process.在这种情况下IFooService会发生什么情况?这只是一个例子,您将传递服务所需的任何依赖项。如果您愿意,您可以将提供程序传递给该服务,该服务将解决其自身的依赖项。链接的答案包含模式信息。Oleg,感谢您的回复,但Diego已为我解决了此问题。我仍将我看了一下你的项目,它看起来非常有用和有趣!
protected override async Task RunAsync(CancellationToken cancellationToken)
{
// TODO: Replace the following sample code with your own logic
// or remove this RunAsync override if it's not needed in your service.
while (true)
{
cancellationToken.ThrowIfCancellationRequested();
ServiceEventSource.Current.ServiceMessage(this.Context, "Hello!");
// do db stuff here!
await Task.Delay(TimeSpan.FromSeconds(5), cancellationToken);
}
}
private static void Main(string[] args)
{
new HostBuilder()
.DefineStatelessService(
serviceBuilder => {
serviceBuilder
.UseServiceType("ServiceName")
.DefineDelegate(
delegateBuilder => {
delegateBuilder.ConfigureDependencies(
dependencies => {
dependencies.AddScoped<FaxLogic>();
});
delegateBuilder.UseDelegate(
async (StatelessServiceContext context, FaxLogic faxLogic) => {
while (true) {
cancellationToken.ThrowIfCancellationRequested();
ServiceEventSource.Current.ServiceMessage(context, "Hello!");
await Task.Delay(TimeSpan.FromSeconds(5), cancellationToken);
});
})
})
.Build()
.Run();
}
public static class Program
{
public static void Main(string[] args)
{
var provider = new ServiceCollection()
.AddLogging()
.AddSingleton<IFooService, FooService>()
.AddSingleton<IMonitor, MyMonitor>()
.BuildServiceProvider();
ServiceRuntime.RegisterServiceAsync("MyServiceType",
context => new MyService(context, provider.GetService<IMonitor>());
}).GetAwaiter().GetResult();