项目
版本

Autofac 服务 Fabric 集成

Autofac.ServiceFabric 包允许将 Autofac 与 服务 Fabric 服务集成。

快速入门

Main 程序方法中,使用 Autofac 扩展构建容器并注册服务。这将从容器和 ServiceRuntime 中附加服务注册。在应用关闭时,释放容器。

using System;
using System.Diagnostics;
using System.Reflection;
using System.Threading;
using Autofac;
using Autofac.Integration.ServiceFabric;

namespace DemoService
{
    public static class Program
    {
        private static void Main()
        {
            try
            {
                // ServiceManifest.xml 文件定义了一个或多个服务类型名称。
                // 注册服务将服务类型名称映射到 .NET 类型。
                // 当服务 Fabric 创建这种服务类型的实例时,
                // 在此主机进程中会创建该类的实例。

                // 使用值得信赖的旧容器构建器开始。
                var builder = new ContainerBuilder();

                // 注册任何常规依赖项。
                builder.RegisterModule(new LoggerModule(ServiceEventSource.Current.Message));

                // 注册支持 Service Fabric 的 Autofac 魔术。
                builder.RegisterServiceFabricSupport();

                // 注册一个无状态服务...
                builder.RegisterStatelessService<DemoStatelessService>("DemoStatelessServiceType");

                // ...或注册一个有状态服务。
                // builder.RegisterStatefulService<DemoStatefulService>("DemoStatefulServiceType");

                using (builder.Build())
                {
                    ServiceEventSource.Current.ServiceTypeRegistered(
                        Process.GetCurrentProcess().Id,
                        typeof(DemoStatelessService).Name);

                    // 防止此主机进程终止,因此服务将继续运行。
                    Thread.Sleep(Timeout.Infinite);
                }
            }
            catch (Exception e)
            {
                ServiceEventSource.Current.ServiceHostInitializationFailed(e.ToString());
                throw;
            }
        }
    }
}

按请求的范围

可以利用 Autofac 支持的 隐式关系 来实现一种 “按请求” 风格的范围机制。

例如,如果您的无状态服务实际上是单例,则想要使用 Func<T>Func<Owned<T>> 关系(分别对应非可丢弃和可丢弃组件)将自动生成的工厂注入到服务中。然后,您的服务可以根据需要解析依赖项。

例如,假设您有一个无状态的用户服务,它需要读取不应作为单例的后端存储。假设后端存储是 IDisposable 的,您想使用 Func<Owned<T>> 并像这样注入它:

public class UserService : IUserService
{
    private readonly Func<Owned<IUserStore>> _userStoreFactory;

    public UserService(Func<Owned<IUserStore>> userStoreFactory)
    {
        _userStoreFactory = userStoreFactory;
    }

    public async Task<string> GetNameAsync(int id)
    {
        using (var userStore = _userStoreFactory())
        {
            return await userStore.Value.GetNameAsync(id);
        }
    }
}

虽然没有关于特定于请求处理的“内置”语义,但您可以利用 隐式关系 做很多事情,因此熟悉它们是值得的。

示例

有关服务 Fabric 集成的示例项目,请参阅 Autofac 示例仓库

在本文档中