使用默认 ASP.NET 核心 DI 容器在 Service Fabric 上设置依赖注入
Set up Dependency Injection on Service Fabric using default ASP.NET Core DI container
我想使用 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
class 依赖于 ConfigProvider
class,我将如何设置 DI,如下所示:
public MyMonitor(IConfigProvider configProvider)
{
this._configProvider = configProvider;
}
我想这个问题会给你一些启示:Why does ServiceRuntime.RegisterServiceAsync return before the serviceFactory func completes?
从技术上讲,ServiceRuntime.RegisterServiceAsync()
是一个依赖注册,它需要你传递serviceTypeName和负责创建服务的工厂方法Func<StatelessServiceContext, StatelessService> serviceFactory
工厂方法接收上下文和 returns 服务(有状态或无状态)。
对于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:
- Never Register the context (StatelessServiceContext\StatefulServiceContext) in the DI, in a shared process approach, multiple partitions might be hosted on same process and will ahve multiple contexts.
- This code snippet is not tested, I've used in the past, don't have access to validate if matches the same code, but is very close to the approach used, might need some tweaks.
嗨@OscarCabreraRodríguez
我正在从事简化 Service Fabric Reliable Services 开发的项目,它对依赖项注入场景有很好的内置支持。
您可以找到一般信息 project page, wiki and specific information about dependency injection here。
这个想法是项目将您从直接使用 Service
实例中抽象出来,而不是为您提供一组更具体的对象。
这里是 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)}";
}
}
希望我正确理解您的用例并且此信息是相关的。
我想使用 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
class 依赖于 ConfigProvider
class,我将如何设置 DI,如下所示:
public MyMonitor(IConfigProvider configProvider)
{
this._configProvider = configProvider;
}
我想这个问题会给你一些启示:Why does ServiceRuntime.RegisterServiceAsync return before the serviceFactory func completes?
从技术上讲,ServiceRuntime.RegisterServiceAsync()
是一个依赖注册,它需要你传递serviceTypeName和负责创建服务的工厂方法Func<StatelessServiceContext, StatelessService> serviceFactory
工厂方法接收上下文和 returns 服务(有状态或无状态)。
对于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:
- Never Register the context (StatelessServiceContext\StatefulServiceContext) in the DI, in a shared process approach, multiple partitions might be hosted on same process and will ahve multiple contexts.
- This code snippet is not tested, I've used in the past, don't have access to validate if matches the same code, but is very close to the approach used, might need some tweaks.
嗨@OscarCabreraRodríguez
我正在从事简化 Service Fabric Reliable Services 开发的项目,它对依赖项注入场景有很好的内置支持。
您可以找到一般信息 project page, wiki and specific information about dependency injection here。
这个想法是项目将您从直接使用 Service
实例中抽象出来,而不是为您提供一组更具体的对象。
这里是 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)}";
}
}
希望我正确理解您的用例并且此信息是相关的。