有状态服务的依赖注入

时间:2016-07-05 14:07:59

标签: c# dependency-injection autofac azure-service-fabric

我有一个Service Fabric状态服务,它包含一个RunAsync循环和一个OWIN Web API监听器。是否可以在StatefulService继承的类和API控制器中添加依赖注入?我真的只能得到一个或另一个。

如果我将容器逻辑放在Startup.cs中,那么我可以轻松地为Web API控制器获取DI,而不是有状态服务。

如果我将容器逻辑放在Program.cs中,那么我可以获取有状态服务而不是web api。 (实际上这感觉更像是服务定位器,但在这种情况下我没关系)

Program.cs的

private static void Main()
{
    var builder = new ContainerBuilder();

    builder.RegisterModule<MyModule>();

    var container = builder.Build();

    ILogger logger = container.Resolve<ILogger>();

    ServiceRuntime.RegisterServiceAsync("MyService", (context) => new MyService(context, logger)).GetAwaiter().GetResult();
}

在没有将IContainer传递给StatefulService构造函数的情况下,我不知道如何将其用于Web API的Startup初始化以设置DependencyResolver。

1 个答案:

答案 0 :(得分:4)

我有一个解决方案,我在通信监听器创建中创建容器。

protected override IEnumerable<ServiceInstanceListener> 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");
}

如果我想访问服务中的容器,我也可以这样做。