Ich möchte AutoFac verwenden, um den aktuellen Prinzipal in die Objekte zu injizieren, die es benötigen. Angenommen, ich habe ein Objekt (AuthorizationValidator
), das Sicherheitsprüfungen durchführt. Es sieht etwa so aus:AutoFac: Inject Nullwerte
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
...
}
}
Für meine Web-Anwendung die AuthorizationValidator registriert ist, und ich verwenden Sie die folgende Registrierung des Auftraggebers zu injizieren:
builder.Register<IPrincipal>((c, p) => HttpContext.Current?.User);
Andere Arten von Anwendungen des Auftraggebers Thread oder etwas ähnliches . Alle Objekte, die den Principal benötigen, erhalten den richtigen Principal injected.
Wenn ein Anruf ohne Autorisierung erfolgt, löst AutoFac eine Ausnahme aus, die besagt, dass das Objekt IPrincipal
nicht zur Verfügung gestellt werden kann, da die Fabrik null
zurückgegeben hat. In diesem Fall ist ein leerer Prinzipal in Ordnung und sollte keine Ausnahme auslösen.
Ich weiß nicht, was in Autofac ist, aber es gibt eine Chance, dass dies funktionieren könnte: 'Builder.Register ((c, p) => (IPrincipal) HttpContext.Current? .User);' –
Allgemein Sprechen, IoC-Frameworks lassen Sie nicht absichtlich null injizieren. Das ist nicht nur eine Autofac-Sache. –
Wäre das [Null-Objekt-Muster] (https://en.wikipedia.org/wiki/Null_Object_pattern) eine Alternative, wie ich in meiner Antwort vorgeschlagen habe? – fknx