2016-03-07 3 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 вызывается, когда любой класс нуждается в IMongoDatabase. IConfiguration будет уже зарегистрирован.

Я бы очень хотел использовать 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

Это именно то, что я искал. Благодарю. –

Смежные вопросы