2014-09-11 4 views
1

Я пытаюсь использовать AutoFac, и все примеры показывают его с использованием инъекции конструктора, которая является рекомендуемой практикой. Это нормально, но я хочу знать, как его использовать, когда инсталляция конструктора невозможна. Например, я хочу использовать NLogger в своем приложении.Использование AutoFac без инъекции конструктора

Регистрация происходит следующим образом:

builder.RegisterType<NLogger>().As<ILogger>().SingleInstance(); 

Как бы я использовать NLogger, не делая так:

public class ProductService : IProductService 
{ 
    private ILogger _logger; 
    public ProductService(ILogger logger) 
    { 
     this._logger = logger; 
    } 
} 

Любая помощь очень ценится.

С уважением.

+0

Итак, если вы не используете инъекцию конструктора, что вы хотите использовать? Вы не приводили пример, когда инъекция конструктора невозможна. – Steven

+0

@Steven возьмите тот же класс и удалите конструктор. Как AutoFac предоставит мне экземпляр NLogger? – Codehelp

+0

Почему вы не можете использовать инъекцию конструктора в своей «ProductService». Кажется, не существует веской причины, по которой вы не должны использовать инъекцию конструктора в этом классе. Можете ли вы объяснить, почему вы не можете использовать инъекцию конструктора? – Steven

ответ

8

Вы можете использовать Property Injection.

В своем классе вы можете иметь

public class MyClass 
{ 
    public ILogger Logger { get; set; } 
} 

и карта с

builder.Register(c => new MyClass { Logger = c.Resolve<ILogger>() }); 

инъекции Конструктор является путь в 99% случаев, хотя.


Если вы просто хотите получить экземпляр, нужно вызвать

var logger = container.Resolve<ILogger>(); 

Где container ваш AutoFac контейнер - это может быть извлекается из глобальной переменной - в ASP.NET MVC (если вы что вы можете это сделать, вы можете сделать это, позвонив по телефону

var logger = DependencyResolver.Current.GetService<ILogger>(); 
+0

В этом случае ILogger должен быть свойством каждого класса. Я не хочу это расстраивать. – Codehelp

+0

Я думаю, что, может быть, вы задаете неправильный вопрос: что вы на самом деле хотите только для глобального экземпляра журнала? Если это так, это не имеет никакого отношения к инъекции зависимостей. –

+1

Глобальный или нет, это не вопрос, я могу использовать его только в одном методе. Я хочу знать, может ли AutoFac предоставить экземпляр без конструктора или параметра. – Codehelp

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