Osc*_*uez 3 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 how I use it
public MyService(StatefulServiceContext context, IMonitor myMonitor)
: base(context)
{
this._myMonitor = myMonitor;
}
Run Code Online (Sandbox Code Playgroud)
如果MyMonitor类依赖于ConfigProvider类,我将如何设置 DI ,如下所示:
public MyMonitor(IConfigProvider configProvider)
{
this._configProvider = configProvider;
}
Run Code Online (Sandbox Code Playgroud)
我认为这个问题会给你一些启发:为什么 ServiceRuntime.RegisterServiceAsync 在 serviceFactory func 完成之前返回?
从技术上讲,这ServiceRuntime.RegisterServiceAsync()是一个依赖项注册,它需要您传递 serviceTypeName 和负责创建服务的工厂方法Func<StatelessServiceContext, StatelessService> serviceFactory
工厂方法接收上下文并返回服务(有状态或无状态)。
对于 DI,您应该提前注册所有依赖项并调用解析服务来创建构造函数,例如:
var provider = new ServiceCollection()
.AddLogging()
.AddSingleton<IFooService, FooService>()
.AddSingleton<IMonitor, MyMonitor>()
.BuildServiceProvider();
ServiceRuntime.RegisterServiceAsync("MyServiceType",
context => new MyService(context, provider.GetService<IMonitor>());
}).GetAwaiter().GetResult();
Run Code Online (Sandbox Code Playgroud)
PS:
- 永远不要在 DI 中注册上下文 (StatelessServiceContext\StatefulServiceContext),在共享进程方法中,多个分区可能托管在同一个进程上,并且会有多个上下文。
- 此代码片段未经测试,我过去使用过,无法验证是否匹配相同的代码,但与所使用的方法非常接近,可能需要进行一些调整。
| 归档时间: |
|
| 查看次数: |
3147 次 |
| 最近记录: |