/ / Ustaw AutoFac, aby używał PropertiesAutowired (true) jako domyślny? - .net, wstrzykiwanie zależności, kontener IOC

Ustaw AutoFac, aby używał PropertiesAutnostred (true) jako domyślnego? - .net, iniekcja zależności, ioc-container

Czy istnieje sposób, w jaki mogę ustawić AutoFac, aby używał PropertiesAutowired (true), aby był domyślny dla wszystkich rejestrowanych typów.

tzn. nie chcę przez cały czas używać „.PropertiesAutowired (true)”

var builder = new ContainerBuilder();
builder.RegisterType<Logger>()
.PropertiesAutowired(true)
.SingleInstance();

Odpowiedzi:

9 dla odpowiedzi № 1

Można to zrobić za pomocą modułu, np.

class InjectPropertiesByDefaultModule : Autofac.Module {
protected override void AttachToComponentRegistration(
IComponentRegistration registration,
IComponentRegistry registry) {
registration.Activating += (s, e) => {
e.Context.InjectProperties(e.Instance);
};
}
}

Następnie:

builder.RegisterModule<InjectPropertiesByDefaultModule>();

Myślę, że możesz nie rozumieć true paramerter to PropertiesAutowired - określa, w jaki sposób obsługiwane są zależności cykliczne i prawdopodobnie powinny pozostać false. Aby emulować true ustawienie, do którego możesz dołączyć Activated zamiast Activating powyżej.

Jednak jeśli to w ogóle możliwe, używaj wstrzykiwania konstruktora nawet dla „opcjonalnych” zależności, takich jak Twoja ILog. Prowadzi to do czystszych komponentów (np. Można tworzyć pola readonly), a zależności są bardziej zrozumiałe („wszystkie są w konstruktorze i nie ma zgadywania co do znaczenia poszczególnych właściwości).

Rozważ użycie zastrzyku właściwości tylko wtedy, gdy istnieje wiele konfiguracji aplikacji, aw niektórych konfiguracjach zależność będzie naprawdę nieobecna.

Nawet w tych przypadkach wzór „Null Object” jest zwykle lepiej dopasowany.


0 dla odpowiedzi nr 2

Nie, nie ma. Chociaż rejestracja typów zbiorczo lub zgodnie z konwencją będzie łatwiejsza, np. Przy użyciu builder.RegisterAssemblyTypes(..).

Aktualizacja: Tak, widzicie Odpowiedź Nikola.