有状态服务的dependency injection
我有一个Service Fabric状态服务,它包含一个RunAsync循环和一个OWIN Web API监听器。 是否可以在StatefulServiceinheritance的类和API控制器中添加dependency injection? 我真的只能得到一个或另一个。
如果我将容器逻辑放在Startup.cs中,那么我可以轻松地为Web API控制器获取DI,但不能获得有状态服务。
如果我将容器逻辑放在Program.cs中,那么我可以获得有状态服务而不是web api。 (实际上这感觉更像服务定位器,但在这种情况下我没关系)
Program.cs中
private static void Main() { var builder = new ContainerBuilder(); builder.RegisterModule(); var container = builder.Build(); ILogger logger = container.Resolve(); ServiceRuntime.RegisterServiceAsync("MyService", (context) => new MyService(context, logger)).GetAwaiter().GetResult(); }
在没有将IContainer传递给StatefulService构造函数的情况下,我不知道如何将其用于Web API的Startup初始化以设置DependencyResolver。
我有一个解决方案,我在通信监听器创建中创建容器。
protected override IEnumerable CreateServiceInstanceListeners() { return new[] { new ServiceInstanceListener(CreateOwinCommunicationListener, "owin") }; } private ICommunicationListener CreateOwinCommunicationListener(StatelessServiceContext context) { var container = CreateContainer(); return new OwinCommunicationListener("api", new Startup(container), context, Log, "WebServiceEndpoint"); }
如果我想访问服务中的容器,我也可以这样做。