2016-11-25 6 views
1

Ich habe einen Service und praktisch jede Methode erfordert den aktuellen Benutzer auszuführen. Bevor ich mit Autofac begonnen habe ich im Grunde eine öffentliche Eigenschaft wie folgt aus:Autofac Erhalten der aktuellen Identität

private IOrderProvider _orderProvider; 

public IOrderProvider OrderProvider => _orderProvider ?? (_orderProvider = new OrderProvider((ClaimsIdentity)User.Identity)); 

Da dies eine öffentliche Eigenschaft auf dem Controller, wäre es Zugang zum Benutzer haben. Jetzt mit Autofac registriere ich meine Service in der StartupConfig. Natürlich habe ich dort keinen Zugriff auf den User.

Gibt es eine Möglichkeit, den aktuellen Benutzer in den OrderProvider Konstruktor zu injizieren, oder eine andere Möglichkeit, um es zu bekommen?

+0

Cr eate einen Dienst, der den HttpContext umschließt und das Benutzerprinzip oder die Benutzeridentität verfügbar macht. was auch immer du willst – Nkosi

+0

kannst du mir ein beispiel geben? – r3plica

+0

Überprüfen Sie das mitgelieferte Beispiel – Nkosi

Antwort

2

Das Benutzerprinzip kann über die HttpContext.Current.User zugegriffen werden. Wie auch immer eng Kopplungscode zu HttpContext ist verpönt, da es nicht sehr Unit-Test ist. Erstellen Sie also einen Dienst, der Ihre Wünsche offen legt.

public interface IPrincipleProvider { 
    IPrincple User { get; } 
} 

Eine Implementierung in der Produktion kann so aussehen.

public class DefaultPrincipleProvider : IPrincipleProvider { 
    public IPrincple User { get { return HttpContext.Current.User; } } 
} 

damit fertig Update der abhängige Klasse verwenden, um die Abstraktion

public class OrderProvider : IOrderProvider { 
    private readonly ClaimsIdentity identity; 
    public OrderProvider(IPrincipleProvider provider) { 
     identity = (ClaimsIdentity)provider.User.Identity; 
    } 
    //...other code 
} 

und dann registrieren Sie den Anbieter beim Start wie üblich

//...other code removed for brevity 

builder.RegisterType<DefaultPrincipleProvider>().As<IPrincipleProvider>(); 
builder.RegisterType<OrderProvider>().As<IOrderProvider>(); 

//...other code removed for brevity 

Der Dienst soll alles

bekommen injiziert
public class Service { 
    private readonly IOrderProvider _orderProvider; 

    public Service(IOrderProvider orderProvider) { 
     _orderProvider = orderProvider; 
    } 

    public IOrderProvider OrderProvider => _orderProvider; 
} 
+0

Mit diesem "Service", muss das nicht auch registriert werden? und dann in den Controller injiziert? und ich nehme an, ich müsste so etwas machen: 'private readonly Service _service' und dann, wenn ich den Bestellprovider brauche, muss ich' _service.OrderProvider' machen? – r3plica

+0

Ja. Ich habe nur den Teil gezeigt, der sich auf den Zugang zum IPrinzip bezieht. Ich habe keine vollständige Kenntnis Ihrer Architektur. Es war nur ein einfaches Beispiel. Ich nahm an, Sie hätten Ihren Dienst bereits registriert. – Nkosi

+0

ich über Ihren Wrapper-Service für den OrderProvider sprechen? Es sei denn, Sie sehen das als Controller? – r3plica

Verwandte Themen