Chcę użyć AutoFac do wstrzyknięcia aktualnej wartości głównej w obiektach, które jej potrzebują. Załóżmy, że mam obiekt (AuthorizationValidator
), który wykonuje kontrole bezpieczeństwa. Wygląda to mniej więcej tak:AutoFac: Wprowadzanie wartości NULL
public AuthorizationValidator : IAuthorizationValidator
{
public AuthorizationValidator(IDataAccess dataAccess, IPrincipal principal)
{
// Save injected objects
...
}
public bool CheckPermission(Guid objectId, Action action)
{
// Check if we are authorized at all
if (this.principal == null)
return false;
// Check the permission in the database
...
}
}
Dla mojej aplikacji internetowej AuthorizationValidator jest zarejestrowany i używam następujący rejestrację aby wstrzyknąć Zleceniodawca:
builder.Register<IPrincipal>((c, p) => HttpContext.Current?.User);
Inny rodzaj aplikacje używają głównego wątku lub coś podobnego . Wszystkie obiekty wymagające zleceniodawcy otrzymują odpowiednią moc główną, którą wstrzyknięto.
Jeśli wywołanie zostanie wykonane bez autoryzacji, to AutoFac zgłosi wyjątek informujący mnie, że nie może dostarczyć obiektu IPrincipal
, ponieważ fabryka zwróciła null
. W takim przypadku pusty zleceniodawca jest w porządku i nie powinien zgłaszać wyjątku.
Nie wiem, co jest w Autofac, ale jest szansa, że to zadziała: 'builder.Register ((c, p) => (IPrincipal) HttpContext.Current? .User);' –
Ogólnie mówiąc, framework IoC nie pozwoli ci celowo wstrzykiwać nu. To nie jest tylko sprawa Autofac. –
Czy [wzór obiektu zerowego] (https://en.wikipedia.org/wiki/Null_Object_pattern) byłby alternatywą, jak zasugerowałem w mojej odpowiedzi? – fknx