Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/visual-studio-2008/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Dependency injection 使用默认ASP.NET核心DI容器在服务结构上设置依赖项注入_Dependency Injection_.net Core_Azure Service Fabric - Fatal编程技术网

Dependency injection 使用默认ASP.NET核心DI容器在服务结构上设置依赖项注入

Dependency injection 使用默认ASP.NET核心DI容器在服务结构上设置依赖项注入,dependency-injection,.net-core,azure-service-fabric,Dependency Injection,.net Core,Azure Service Fabric,我想使用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 ho

我想使用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;
}

我想这个问题会给你一些启示:

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

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

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

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

ServiceRuntime.RegisterServiceAsync("MyServiceType",
    context => new MyService(context, provider.GetService<IMonitor>());
}).GetAwaiter().GetResult();
var provider=newservicecolection()
.AddLogging()
.AddSingleton()
.AddSingleton()
.BuildServiceProvider();
ServiceRuntime.RegisterServiceAsync(“MyServiceType”,
context=>newmyservice(context,provider.GetService());
}).GetAwaiter().GetResult();
附言:

  • 永远不要在DI中注册上下文(无状态ServiceContext\StatefulServiceContext),在共享进程方法中,多个分区可能托管在同一进程上,并且将具有多个上下文
  • 此代码段未经测试,我在过去使用过,无法验证是否与同一代码匹配,但非常接近使用的方法,可能需要一些调整

嗨@OscarCabreraRodríguez

我正在从事简化服务结构可靠服务开发的项目,该项目具有对依赖注入场景的强大内置支持

您可以找到有关依赖项注入的一般信息和特定信息

其思想是project将您从直接使用
服务
实例抽象出来,而不是为您提供一组更具体的对象

下面是ASP.NET核心应用程序的一个简单示例:

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)}";
  }
}
publicstaticvoidmain(字符串[]args)
{
新主机生成器()
.DefineStatefulService(
serviceBuilder=>
{
服务建设者
.UseServiceType(“服务类型”)
.DefineAspNetCoreListener(
listenerBuilder=>
{
监听器生成器
.UseEndpoint(“ServiceEndpoint”)
.UseUniqueServiceUrlIntegration()
.ConfigureWebHost(
webHostBuilder=>
{ 
网络主机生成器
.配置服务(
服务=>
{
//您可以像往常一样进行配置。
services.AddTransient();
})
.UseStartup();
});
});
})
.Build()
.Run();
[路线(“api”)]
公共类ApiController:控制器
{
公共ApiController(IMyService服务){}
[HttpGet]
[路线(“价值”)]
公共字符串GetValue()
{
从{nameof(ApiController)}返回$“值”;
}
}

希望我能正确理解您的用例,并且此信息是相关的。

谢谢@Oleg Karasik,但我更喜欢使用Diego Mendes(以下)的答案,因为它更接近我所寻找的