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 示例仓库 。