2016-03-07 32 views
4

解决界面我想有一个像下面如何使用工厂使用Autofac

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>。后者似乎太钝了,需要消费者执行我应该能够为他们实施的步骤。

回答

4

你可以这样注册的静态GetMongoDatabase工厂方法:采用静态方法可能会产生一些问题

builder.Register(c => MongoDbFactory.GetMongoDatabase(c.Resolve<IConfiguration>)()) 
     .As<IMongoDatabase>(); 

顺便说一句,它可能是更好注册MongoDbFactory类,并在您的使用工厂注册。

builder.RegisterType<MongoDbFactory>() 
     .AsSelf(); 

builder.Register(c => c.Resolve<MongoDbFactory>().GetMongoDatabase()) 
     .As<IMongoDatabase>(); 

当然,你需要适应MongoDbFactory实施,使其工作 - 通过添加配置属性,并添加IConfiguration的构造。

+0

这正是我一直在寻找。谢谢。 –