如何使用工厂解析使用Autofac的界面

时间:2016-03-07 21:03:49

标签: c# autofac factory

我希望获得如下服务

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时调用IMongoDatabaseIConfiguration已经注册。

我真的很想在我的服务中使用IMongoDatabase而不是Func<IConfiguration, IMongoDatabase>。后者似乎过于迟钝,要求消费者实施我应该能够为他们实施的步骤。

1 个答案:

答案 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添加到构造函数。