使用默认的ASP.NET Core DI容器在Service Fabric上设置依赖注入

问题描述 投票:1回答:2

我想使用ASP.NET Core的默认DI容器为我的Service Fabric项目设置DI。

//This is what I've got so far, and it works great
ServiceRuntime.RegisterServiceAsync(
  "MyServiceType",
  context => new MyService(context, new MyMonitor()
).GetAwaiter().GetResult();

//This is how I use it
public MyService(StatefulServiceContext context, IMonitor myMonitor)
  : base(context)
{
  this._myMonitor = myMonitor;           
}

如果MyMonitor类依赖于ConfigProvider类,我将如何设置DI,如下所示:

public MyMonitor(IConfigProvider configProvider)
{
  this._configProvider = configProvider;
}
dependency-injection .net-core azure-service-fabric
2个回答
4
投票

我认为这个问题会给你一些启示:Why does ServiceRuntime.RegisterServiceAsync return before the serviceFactory func completes?

从技术上讲,ServiceRuntime.RegisterServiceAsync()是一个依赖注册,它要求你传递serviceTypeName和负责创建服务的工厂方法Func<StatelessServiceContext, StatelessService> serviceFactory

工厂方法接收上下文并返回服务(有状态或无状态)。

对于DI,您应该提前注册所有依赖项并调用resolve服务来创建构造函数,如:

var provider = new ServiceCollection()
            .AddLogging()
            .AddSingleton<IFooService, FooService>()
            .AddSingleton<IMonitor, MyMonitor>()
            .BuildServiceProvider();

ServiceRuntime.RegisterServiceAsync("MyServiceType",
    context => new MyService(context, provider.GetService<IMonitor>());
}).GetAwaiter().GetResult();

PS:

  • 永远不要在DI中注册上下文(StatelessServiceContext \ StatefulServiceContext),在共享流程方法中,多个分区可能托管在同一个进程上,并且会有多个上下文。
  • 这个代码片段未经过测试,我过去曾使用过,如果匹配相同的代码,则无法访问验证,但是非常接近使用的方法,可能需要进行一些调整。

0
投票

您好@OscarCabreraRodríguez

我正在开发简化Service Fabric可靠服务开发的项目,它对依赖注入方案有很好的内置支持。

你可以找到一般信息project pagewiki和有关依赖注入here的具体信息。

这个想法是项目抽象你直接使用Service实例,而不是为你提供一组更具体的对象。

以下是ASP.NET Core应用程序的一个简单示例:

public static void Main(string[] args)
{
  new HostBuilder()
    .DefineStatefulService(
      serviceBuilder =>
      {
        serviceBuilder
          .UseServiceType("ServiceType")
          .DefineAspNetCoreListener(
            listenerBuilder =>
            {
              listenerBuilder
                .UseEndpoint("ServiceEndpoint")
                .UseUniqueServiceUrlIntegration()
                .ConfigureWebHost(
                  webHostBuilder => 
                  { 
                    webHostBuilder
                      .ConfigureServices(
                        services =>
                        {
                          // You can configure as usual.
                          services.AddTransient<IMyService, MyService>();
                        })
                      .UseStartup<Startup>(); 
                  });
            });
      })
      .Build()
      .Run();

[Route("api")]
public class ApiController : Controller
{
  public ApiController(IMyService service) { }

  [HttpGet]
  [Route("value")]
  public string GetValue()
  {
    return $"Value from {nameof(ApiController)}";
  }
}

希望我能正确理解您的用例,这些信息是相关的。

© www.soinside.com 2019 - 2024. All rights reserved.