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 № 1Moż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.