Mam interfejsu, wdrażania i cel:Jak wykonać opcjonalną zależność w AutoFac?
public interface IPerson { public string Name { get; } }
public class Person: IPerson { public string Name { get { return "John"; } } }
public class Target { public Target(IPerson person) {} }
Używam Autofac związać rzeczy razem:
builder.RegisterType<Person>().As<IPerson>().SingleInstance();
Problemem jest to, że IPerson
mieszka we wspólnym zespole, Person
żyje w wtyczce (która może lub nie musi być), a Target
mieszka w głównej aplikacji, która ładuje wtyczki. Jeśli nie ma zainstalowanych wtyczek, które implementują IPerson
, Autofac balistycznych nie będzie w stanie rozwiązać zależności Target
. I nie mogę tego za to winić.
Jednak wiem, że Target
jest w stanie obsłużyć brak numeru IPerson
i byłby bardziej niż szczęśliwy, aby uzyskać zamiast niego null
. W rzeczywistości jestem prawie pewny, że wszystkie komponenty, które polegają na IPerson
, są przygotowane do wzięcia na siebie. Więc jak mogę powiedzieć Autofacowi - "W porządku, kochanie, nie martw się, po prostu daj mi z powrotem null
, dobrze?"
Jednym ze sposobów znalazłem jest dodanie parametru domyślnego Target
:
public class Target { public Target(IPerson person = null) {} }
To działa, ale muszę to zrobić dla wszystkich elementów, które wymagają IPerson
. Czy mogę też zrobić to na odwrót? Jakoś powiedzieć Autofac "Jeśli wszystko inne zawiedzie w celu rozwiązania IPerson
, zwróć wartość null"?
Zobacz także 'ResolveOptional()'. – abatishchev
Jeśli "Osoba" żyje w wtyczce, jak ją zarejestrować? Gdzie jest to wezwanie? 'builder.RegisterType() .As () .SingleInstance();' –
@SriramSakthivel - każda wtyczka ma metodę 'Initialize (ContainerBuilder)', która jest wywoływana przez główną aplikację. Wtyczki rejestrują tam swoje komponenty. –