我希望获得如下服务
public SomeService(IMongoDatabase mongoDatabase) {
DB = mongoDatabase;
}
我希望使用工厂来解析IMongoDatabase
,只是为了封装IConfiguration
用法
public static IMongoDatabase GetMongoDatabase(IConfiguration config)
{
var connectionString = config.Get("SomeConnectionString");
// MongoClient handles connection pooling internally
var client = new MongoClient(connectionString);
var db = client.GetDatabase(config.Get("SomeDbName"));
return db;
}
我无法弄清楚如何处理注册,以便在任何类需要MongoDbFactory.GetMongoDatabase
时调用IMongoDatabase
。 IConfiguration
已经注册。
我真的很想在我的服务中使用IMongoDatabase
而不是Func<IConfiguration, IMongoDatabase>
。后者似乎过于迟钝,要求消费者实施我应该能够为他们实施的步骤。
答案 0 :(得分:6)
您可以注册静态GetMongoDatabase
工厂方法,如下所示:
builder.Register(c => MongoDbFactory.GetMongoDatabase(c.Resolve<IConfiguration>)())
.As<IMongoDatabase>();
顺便说一句,使用静态方法可能会引入一些问题,最好注册MongoDbFactory
类并在 factory 注册中使用它。
builder.RegisterType<MongoDbFactory>()
.AsSelf();
builder.Register(c => c.Resolve<MongoDbFactory>().GetMongoDatabase())
.As<IMongoDatabase>();
当然,您需要调整MongoDbFactory
实现以使其工作 - 通过为Configuration添加属性并将IConfiguration添加到构造函数。