【发布时间】:2020-01-13 01:35:46
【问题描述】:
我希望一个项目具有实体框架 nuget 包,而其他项目只需在启动时使用其模型名称注册此服务。我见过这种方法的 mongo 版本,但我找不到任何 ef 版本。 蒙哥示例: 在服务项目中:
using Autofac;
using DShop.Common.Types;
using Microsoft.Extensions.Configuration;
using MongoDB.Driver;
namespace DShop.Common.Mongo
{
public static class Extensions
{
public static void AddMongo(this ContainerBuilder builder)
{
builder.Register(context =>
{
var configuration = context.Resolve<IConfiguration>();
var options = configuration.GetOptions<MongoDbOptions>("mongo");
return options;
}).SingleInstance();
builder.Register(context =>
{
var options = context.Resolve<MongoDbOptions>();
return new MongoClient(options.ConnectionString);
}).SingleInstance();
builder.Register(context =>
{
var options = context.Resolve<MongoDbOptions>();
var client = context.Resolve<MongoClient>();
return client.GetDatabase(options.Database);
}).InstancePerLifetimeScope();
builder.RegisterType<MongoDbInitializer>()
.As<IMongoDbInitializer>()
.InstancePerLifetimeScope();
builder.RegisterType<MongoDbSeeder>()
.As<IMongoDbSeeder>()
.InstancePerLifetimeScope();
}
public static void AddMongoRepository<TEntity>(this ContainerBuilder builder, string collectionName)
where TEntity : IIdentifiable
=> builder.Register(ctx => new MongoRepository<TEntity>(ctx.Resolve<IMongoDatabase>(), collectionName))
.As<IMongoRepository<TEntity>>()
.InstancePerLifetimeScope();
}
}
在 web 项目的启动中:
var builder = new ContainerBuilder();
builder.RegisterAssemblyTypes(Assembly.GetEntryAssembly())
.AsImplementedInterfaces();
builder.Populate(services);
builder.AddMongo();
builder.AddMongoRepository<Cart>("Carts");
builder.AddMongoRepository<Customer>("Customers");
builder.AddMongoRepository<Product>("Products");
Container = builder.Build();
【问题讨论】:
标签: c# entity-framework microservices