我想使用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;
}
我认为这个问题会给你一些启示: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),在共享流程方法中,多个分区可能托管在同一个进程上,并且会有多个上下文。
- 这个代码片段未经过测试,我过去曾使用过,如果匹配相同的代码,则无法访问验证,但是非常接近使用的方法,可能需要进行一些调整。
您好@OscarCabreraRodríguez
我正在开发简化Service Fabric可靠服务开发的项目,它对依赖注入方案有很好的内置支持。
你可以找到一般信息project page,wiki和有关依赖注入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)}";
}
}
希望我能正确理解您的用例,这些信息是相关的。