Skip to main content

[.net core template project]HostedService with Autofac AttributeFilter

· 3 min read
<Project Sdk="Microsoft.NET.Sdk">

<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>netcoreapp2.2</TargetFramework>
</PropertyGroup>

<ItemGroup>
<Compile Remove="GameCacheRefreshJob.cs" />
<Compile Remove="JobFactory.cs" />
<Compile Remove="OperationSessionCache.cs" />
<Compile Remove="OperationSessionJob.cs" />
<Compile Remove="SocketAdapter.cs" />
</ItemGroup>

<ItemGroup>
<Content Include="appsettings.json">
<CopyToPublishDirectory>Always</CopyToPublishDirectory>
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</Content>
</ItemGroup>

<ItemGroup>
<PackageReference Include="Microsoft.Extensions.Configuration.EnvironmentVariables" Version="2.2.4" />
<PackageReference Include="Microsoft.Extensions.Configuration.FileExtensions" Version="2.2.0" />
<PackageReference Include="Microsoft.Extensions.Configuration.Json" Version="2.2.0" />
<PackageReference Include="Microsoft.Extensions.Hosting" Version="2.2.0" />
<PackageReference Include="Microsoft.Extensions.Logging.Console" Version="2.2.0" />
<PackageReference Include="Microsoft.Extensions.Logging.Debug" Version="2.2.0" />
<PackageReference Include="Q1.Foundation.RabbitConnector" Version="1.0.1" />
<PackageReference Include="Q1.Foundation.RepoLibs" Version="0.1.1" />
<PackageReference Include="Serilog.Extensions.Logging" Version="2.0.4" />
<PackageReference Include="Serilog.Settings.Configuration" Version="3.1.0" />
<PackageReference Include="Serilog.Sinks.Elasticsearch" Version="7.1.0" />
</ItemGroup>

<ItemGroup>
<ProjectReference Include="..\Q1.Activity.Cache\Q1.Activity.Cache.csproj" />
<ProjectReference Include="..\Q1.Activity.Models\Q1.Activity.Models.csproj" />
</ItemGroup>

</Project>
using Autofac;
using Autofac.Extensions.DependencyInjection;
using Autofac.Features.AttributeFilters;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
using Microsoft.Extensions.Logging;
using Q1.Activity.Cache;
using Q1.Activity.Daemon.Services;
using Q1.Foundation.RabbitConnector;
using Q1.Foundation.RepoLibs;
using Q1.Foundation.RepoLibs.Models;
using Serilog;
using System;
using System.IO;

namespace Q1.Activity.Daemon
{
class Program
{
static void Main(string[] args)
{
var host = new HostBuilder()
// Configuration files and Environment registration
.ConfigureHostConfiguration(configurationBuilder =>
{
configurationBuilder.SetBasePath(Directory.GetCurrentDirectory());
configurationBuilder.AddEnvironmentVariables("ASPNETCORE_");
})
.ConfigureAppConfiguration((hostBuilderContext, configurationBuilder) =>
{
configurationBuilder.AddJsonFile("appsettings.json", true);
configurationBuilder.AddJsonFile($"appsettings.{hostBuilderContext.HostingEnvironment.EnvironmentName}.json", true);
configurationBuilder.AddEnvironmentVariables();
})
.ConfigureServices((hostBuilderContext, services) =>
{
// Serilog Registration
Log.Logger = new LoggerConfiguration()
.ReadFrom.Configuration(hostBuilderContext.Configuration)
.CreateLogger();

services.AddLogging(config =>
{
config.AddConsole();
config.AddSerilog();
});

services.AddOptions();

// MongoDB, Redis and RabbitMQ Connection registration
services.Configure<ConnectionStrings>(hostBuilderContext.Configuration.GetSection("ConnectionStrings"));
services.AddSingleton<IMongoLib, MongoLib>();
services.AddRabbitConnection(hostBuilderContext.Configuration);

// Daemon services registration
services.AddHostedService<TaskProcessor>();
})
.ConfigureContainer<ContainerBuilder>((hostBuilderContext, containerBuilder) =>
{
// IRedisLib instances registration
containerBuilder.RegisterType<RedisLib>()
.UsingConstructor(typeof(string))
.WithParameter("connectionString", hostBuilderContext.Configuration.GetSection("ConnectionStrings:RedisCache").Value)
.Named<IRedisLib>("RedisCache")
.SingleInstance();
containerBuilder.RegisterType<RedisLib>()
.UsingConstructor(typeof(string))
.WithParameter("connectionString", hostBuilderContext.Configuration.GetSection("ConnectionStrings:RedisSocket").Value)
.Named<IRedisLib>("RedisSocket")
.SingleInstance();

containerBuilder.RegisterType<RedisCache>().As<ICache>().WithAttributeFiltering();
})
.UseServiceProviderFactory(new AutofacServiceProviderFactory())
.ConfigureLogging((hostBuilderContext, loggingBuilder) =>
{
loggingBuilder.AddConfiguration(hostBuilderContext.Configuration.GetSection("Logging"));
loggingBuilder.AddSerilog();

if (hostBuilderContext.HostingEnvironment.EnvironmentName == EnvironmentName.Development)
{
loggingBuilder.AddDebug();
}

loggingBuilder.AddConsole();
})
.UseConsoleLifetime()
.Build();

host.Run();
}
}
}
using Autofac.Features.AttributeFilters;
using Microsoft.Extensions.Hosting;
using Newtonsoft.Json;
using Q1.Foundation.RepoLibs;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using DataEntity = Q1.Activity.Models.DataEntity;
using Interface = Q1.Activity.Models.Interface;
using Internal = Q1.Activity.Models.Internal;

namespace Q1.Activity.Cache
{
public class RedisCache : ICache
{
readonly IMongoLib _db;
readonly IRedisLib _redis;
readonly IHostingEnvironment _env;

public RedisCache(IMongoLib db, [KeyFilter("RedisCache")]IRedisLib redis, IHostingEnvironment env)
{
_db = db;
_redis = redis;
_env = env;
}
}
}
{
"Logging": {
"LogLevel": {
"Default": "Information",
"System": "Warning",
"Microsoft": "Warning"
}
},
"Serilog": {
"MinimumLevel": "Information",
"WriteTo": [
{
"Name": "Elasticsearch",
"Args": {
"nodeUris": "http://172.16.126.22:9200",
"indexFormat": "activitymgmt-taskprocessor-{0:yyyy.MM}",
"autoRegisterTemplate": true
}
}
]
},
"rabbit": {
"uri": "amqp://guest:[email protected]:5672"
},
"ConnectionStrings": {
"Mongo": "mongodb://activity:Bing%[email protected]:27017,172.16.127.99:27017,172.16.127.120:27017/ActivityManagement",
"Redis": "172.16.127.229:6379", // Remote Socket Server Registy
"RedisSocket": "172.16.127.229:6379", // Remote Socket Server Registy
"RedisCache": "172.16.127.229:6379,defaultDatabase=1" // Local Cache
},
"AppSettings": {
"GameAreaApiUrl": "http://api.q1oa.com/ControlCenter/GameArea.asmx/GetList?GameCenterKey={0}",
"GameWorldApiUrl": "http://api.q1oa.com/ControlCenter/GameWorld.asmx/GetList?GameCenterKey={0}",
"CacheRefreshInterval": 5, //Game Area/World 缓存刷新间隔(In minutes)
"MqBusinessSend": "ActivityMgmtTx", // Send request to Socket Server
"MqBusinessRecv": "ActivityMgmtRx" // Get response from Socket Server
}
}
ClustrMaps