C# 如何使用.NET Core';s使用服务结构进行内置依赖项注入

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

下午好

我最近开始尝试使用ServiceFabric和.NETCore。 我创建了一个无状态Web API,并使用以下工具执行了一些DI:

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