Service Fabric并没有真正的内置DI机制,至少它是一个非常简单的机制。
如果你想注入依赖到你自己的服务,你可以使用工厂。例如:
ServiceRuntime.RegisterServiceAsync("MyStatelessType",
context =>
{
var loggerFactory = new LoggerFactoryBuilder(context).CreateLoggerFactory(applicationInsightsKey);
ILogger logger = loggerFactory.CreateLogger<MyStateless>();
return new MyStateless(context, logger);
}).GetAwaiter().GetResult();
这是一种在您的服务中注入具体实现的方法。该机制也用于注入上下文。不幸的是,因为它不是一个完整的DI容器,所以你不能在服务实例本身之外获得这个上下文。
所以,你必须把自己的DI容器真正使用它,例如在无状态的Web API,你可以这样做:
protected override IEnumerable<ServiceInstanceListener> CreateServiceInstanceListeners()
{
return new[]
{
new ServiceInstanceListener(serviceContext =>
new WebListenerCommunicationListener(serviceContext, "ServiceEndpoint", (url, listener) =>
{
logger.LogStatelessServiceStartedListening<WebApi>(url);
return new WebHostBuilder().UseWebListener()
.ConfigureServices(
services => services
.AddSingleton(serviceContext)
.AddSingleton(logger)
.AddTransient<IServiceRemoting, ServiceRemoting>())
.UseContentRoot(Directory.GetCurrentDirectory())
.UseServiceFabricIntegration(listener, ServiceFabricIntegrationOptions.None)
.UseStartup<Startup>()
.UseUrls(url)
.Build();
}))
};
}
否则你必须自己做。已经有一些举措,请参阅this one了解AutoFac扩展,并且还有一个Unity扩展。
你想在哪里访问它? –
服务实现类以外的任何位置。在我的具体情况中,在由NServiceBus实例化的事件处理程序类中,所以我不能只将上下文传递给它。 –